Spark DataFrame join后移除重复的列

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

java 复制代码
 Dataset<Row> moviesWithRating = moviesDF
                .join(averageRatingMoviesDF,
                        moviesDF.col("movieId").equalTo(averageRatingMoviesDF.col("movieId")));

其schema如下:

java 复制代码
//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的列)
java 复制代码
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解决方案:

scala 复制代码
df1.join(df2, Seq("id","name"),"left")  // df1和df2使用了id和name两列来做join,返回的结果会对这两列去
  • 方法二:使用select返回指定的列
java 复制代码
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")
                );

说明:

如果列较少, 推荐使用第二种.

如果列较多, 推荐使用第一种.

相关推荐
yumgpkpm1 小时前
腾讯云TBDS与CDH迁移常见问题有哪些?建议由CDH迁移到CMP 7.13 平台(类Cloudera CDP,如华为鲲鹏 ARM 版)
hive·hadoop·zookeeper·flink·spark·kafka·hbase
无心水2 小时前
【分布式利器:限流】3、微服务分布式限流:Sentinel集群限流+Resilience4j使用教程
分布式·微服务·架构·sentinel·分布式限流·resilience4j·分布式利器
艾莉丝努力练剑3 小时前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
能鈺CMS3 小时前
能鈺CMS · 虚拟发货源码
java·大数据·数据库
一起学开源3 小时前
分布式基石:CAP定理与ACID的取舍艺术
分布式·微服务·架构·流程图·软件工程
雁于飞3 小时前
分布式基础
java·spring boot·分布式·spring·wpf·cloud native
非著名架构师4 小时前
极端天气下的供应链韧性:制造企业如何构建气象风险防御体系
大数据·人工智能·算法·制造·疾风气象大模型·风光功率预测
做萤石二次开发的哈哈5 小时前
11月27日直播预告 | 萤石智慧台球厅创新场景化方案分享
大数据·人工智能
Hello.Reader6 小时前
使用 Flink CDC 搭建跨库 Streaming ETLMySQL + Postgres → Elasticsearch 实战
大数据·elasticsearch·flink
用户199701080186 小时前
1688图片搜索API | 上传图片秒找同款 | 相似商品精准推荐
大数据·数据挖掘·图片资源