ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spark dataset 相同列名 join

2021-06-21 16:06:36  阅读:214  来源: 互联网

标签:df2 join show df1 dataset b1 spark null col


具有部分相同、部分不同列名的两个Dataset按照部分相同、部分不同列相等进行join操作,有以下几种方式:

val df1 = Seq((1, 2, 3),(1, 1, 1)).toDF("a", "b", "c")
val df2 = Seq((1, 2, 4),(2, 2, 2)).toDF("a", "b1", "d")
df1.show
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  1|  1|  1|
+---+---+---+
df2.show
+---+---+---+
|  a| b1|  d|
+---+---+---+
|  1|  2|  4|
|  2|  2|  2|
+---+---+---+
//join条件:df1("a") == df2("a") && df1("b") == df2("b1")


//若是直接join会报错:org.apache.spark.sql.AnalysisException: Reference 'a' is ambiguous, could be:...
df1.join(df2, col("a") === col("a") && col("b") === col("b1"), "outer").show
//可以改为这样:
df1.join(df2, df1("a") === df2("a") && col("b") === col("b1"), "outer").show
+----+----+----+----+----+----+
|   a|   b|   c|   a|  b1|   d|
+----+----+----+----+----+----+
|null|null|null|   2|   2|   2|
|   1|   2|   3|   1|   2|   4|
|   1|   1|   1|null|null|null|
+----+----+----+----+----+----+


//当然也可以将其中一个Dataset的列改名,改为都相同或都不同,再用上面的方法join
df1.join(df2.withColumnRenamed("b1", "b"), Seq("a", "b"), "outer").show
+---+---+----+----+
|  a|  b|   c|   d|
+---+---+----+----+
|  2|  2|null|   2|
|  1|  2|   3|   4|
|  1|  1|   1|null|
+---+---+----+----+


//还可以用Dataset的as方法(与alias方法等效),给Dataset命名,然后消除歧义。(Dataset的别名类似SQL中表的别名)
df1.alias("df1")
.join(df2.as("df2"), col("df1.a") === col("df2.a") && col("b") === col("b1"), "outer")
.show
+----+----+----+----+----+----+
|   a|   b|   c|   a|  b1|   d|
+----+----+----+----+----+----+
|null|null|null|   2|   2|   2|
|   1|   2|   3|   1|   2|   4|
|   1|   1|   1|null|null|null|
+----+----+----+----+----+----+
//如果只想保留df2的a列:
val t = df1.alias("df1")
.join(df2.as("df2"), col("df1.a") === col("df2.a") && col("b") === col("b1"), "outer")
.drop(col("df1.a")).show
+----+----+----+----+----+
|   b|   c|   a|  b1|   d|
+----+----+----+----+----+
|null|null|   2|   2|   2|
|   2|   3|   1|   2|   4|
|   1|   1|null|null|null|
+----+----+----+----+----+

补充: 
Dataset的as方法(与alias方法等效):为Dataset对象起别名,Dataset的别名类似SQL中表的别名。

val df = Seq((1, 2),(1, 1)).toDF("a", "b")
df.select("a").show
+---+
|  a|
+---+
|  1|
|  1|
+---+
df.select("df.a").show
//报错:org.apache.spark.sql.AnalysisException: cannot resolve 'df.a' given input columns: [a, b];


df.as("df").select("df.a").show
+---+
|  a|
+---+
|  1|
|  1|
+---+

本文由【张】发布于开源中国,原文链接:https://my.oschina.net/u/2000675/blog/3106422

标签:df2,join,show,df1,dataset,b1,spark,null,col
来源: https://blog.51cto.com/u_15278282/2931949

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有