当前位置: 首页 > 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"));

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

http://www.lryc.cn/news/231465.html

相关文章:

  • NextJS工程部署到阿里云linux Ecs
  • 汽车以太网IOP测试新利器
  • 高防IP是什么?如何隐藏源站IP?如何进行防护?
  • ElasticSearch---查询es集群状态、分片、索引
  • Angular 使用教程——基本语法和双向数据绑定
  • 【ASP.NET】Hello World
  • AI创作系统ChatGPT网站源码+支持最新GPT-Turbo模型+支持DALL-E3文生图/AI绘画源码
  • C#_查找图片(按键精灵找图)
  • C#中.NET Framework4.8 控制台应用通过EF访问新建数据库
  • 无防御香港服务器如何防CC
  • MyBatis的插件能在哪些地方进行拦截?
  • 【BUG库】 记录自己学习工作中遇到的程序BUG
  • 卡尔曼家族从零解剖-(07) 高斯分布积分为1,高斯分布线性变换依旧为高斯分布,两高斯函数乘积仍为高斯。
  • 设计模式-访问者模式(Visitor)
  • C++二分查找算法:132 模式解法二枚举2
  • JavaWeb-HTML
  • 新外卖霸王餐小程序、H5、微信公众号版外卖系统源码
  • LeetCode - #89 格雷编码
  • 11.3SpringMVC
  • c语言从入门到实战——数组指针与函数指针
  • Rust图形界面编程:egui平直布局
  • Android13 wifi adb 串口开启
  • 关于一个屏幕取词程序,AI给的创建思路及指导
  • MySql跨库跨表触发器
  • NextJS开发:shadcn/ui中Button组件扩展增加图标
  • Go 语言
  • 【计算机网络笔记】DHCP协议
  • 21 Linux 自带的LED驱动
  • 神通MPP数据库的跨库查询
  • JavaWeb-WEB请求过程