当前位置: 首页 > news >正文

Spark DataFrame join后移除重复的列

在Spark,两个DataFrame做join操作后,会出现重复的列。例如:

 Dataset<Row> moviesWithRating = moviesDF.join(averageRatingMoviesDF,moviesDF.col("movieId").equalTo(averageRatingMoviesDF.col("movieId")));

其schema如下:

//moviesWithRating.printSchema();/*** root*  |-- _id: struct (nullable = true)*  |    |-- oid: string (nullable = true)*  |-- actors: string (nullable = true)*  |-- description: string (nullable = true)*  |-- directors: string (nullable = true)*  |-- genres: string (nullable = true)*  |-- issue: string (nullable = true)*  |-- language: string (nullable = true)*  |-- movieId: integer (nullable = true)*  |-- shoot: string (nullable = true)*  |-- timeLong: string (nullable = true)*  |-- title: string (nullable = true)*  |-- movieId: integer (nullable = true)*  |-- avgRating: double (nullable = true)*/

我们在继续操作这个DataFrame时,可能就会报错,如下:org.apache.spark.sql.AnalysisException: Reference ‘movieId’ is ambiguous

解决方案有两种方法可以用来移除重复的列

  • 方法一:join表达式使用字符串数组(用于join的列)
Seq<String> joinColumns = JavaConversions.asScalaBuffer(Arrays.asList("movieId", "movieId")).toList();Dataset<Row> moviesWithRating = moviesDF.join(averageRatingMoviesDF,joinColumns,"inner");

这里DataFrame moviesDF和averageRatingMoviesDF使用了movieId和movieId两列来做join,返回的结果会对这两列去重
scala解决方案:

df1.join(df2, Seq("id","name"),"left")  // df1和df2使用了id和name两列来做join,返回的结果会对这两列去
  • 方法二:使用select返回指定的列
Dataset<Row> moviesWithRating = moviesDF.join(averageRatingMoviesDF,moviesDF.col("movieId").equalTo(averageRatingMoviesDF.col("movieId"))).select(moviesDF.col("movieId"),col("actors"),col("description"),col("directors"),col("genres"),col("issue"),col("language"),col("shoot"),col("timeLong"),col("title"),col("avgRating"));

说明:
如果列较少, 推荐使用第二种.
如果列较多, 推荐使用第一种.

相关文章:

  • 【Linux网络】搭建内外网的网关服务器,实现DNS分离解析与DHCP自动分配
  • 决策树,sql考题,30个经典sql题目
  • 扩散模型实战(九):使用CLIP模型引导和控制扩散模型
  • Genio 500_MT8385安卓核心板:功能强大且高效
  • 【算法】算法题-20231117
  • Android 11.0 存在中文字符,中文文件名,中文系统属性,编译报错的解决方案
  • Apache Airflow (八) :DAG任务依赖设置
  • Docker push的 http 413问题处理
  • 卡尔曼家族从零解剖-(07) 高斯分布积分为1,高斯分布线性变换依旧为高斯分布,两高斯函数乘积仍为高斯。
  • 智慧汽车—城市NOA迎爆发
  • 【Python】Pandas(学习笔记)
  • 大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive
  • 学习王阳明知行合一随录
  • yolov5模型代码怎么修改
  • 【ArcGIS处理】行政区划与流域区划间转化
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【RocksDB】TransactionDB源码分析
  • 【笔记】你不知道的JS读书笔记——Promise
  • Angular6错误 Service: No provider for Renderer2
  • css布局,左右固定中间自适应实现
  • django开发-定时任务的使用
  • input实现文字超出省略号功能
  • JavaScript实现分页效果
  • nodejs实现webservice问题总结
  • Python学习之路13-记分
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 工作中总结前端开发流程--vue项目
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 跨域
  • 判断客户端类型,Android,iOS,PC
  • 在weex里面使用chart图表
  • 智能网联汽车信息安全
  • ​Java并发新构件之Exchanger
  • #define 用法
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#3.3_存储_Memory
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (定时器/计数器)中断系统(详解与使用)
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • .dwp和.webpart的区别
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 流——流的类型体系简单介绍
  • .Net 路由处理厉害了
  • .NET简谈设计模式之(单件模式)
  • .net经典笔试题
  • .NET中winform传递参数至Url并获得返回值或文件
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复