使用 scala 基于两个数据框的连接列创建新列
Posted
技术标签:
【中文标题】使用 scala 基于两个数据框的连接列创建新列【英文标题】:To create a new column based on the joining column of two data frames using scala 【发布时间】:2018-04-12 09:00:20 【问题描述】:我有两个表,其中 table1 有 id,name 而table2只有id
table 1
--------------
id name
--------------
1 sudheer
2 sandeep
3 suresh
----------------
表2
--------
id
--------
1
2
-------
如果表2中不存在“id”列,则需要的表应该是“N”,否则为“Y”
table3
id name IND
1 sudheer Y
2 sandeep Y
3 suresh N
我已经尝试了以下步骤来接近:
val df = hc.sql("select * from table1")
val df1 = hc.sql("select * from table2")
我尝试在 table2 中再添加一列(电话),因为我的连接数据框不包含 table2 中的 id,基于该空值我尝试将值设置为 Y/N
val df2 = df.join(df1,Seq("id"),"left_outer").withColumn("IND",exp(when(df1("phone")!= "null","Y").otherwise("N")))
但这并没有解决错误 发现:布尔 必需:org.apache.spark.sql.Column
谁能建议任何想法如何在不向我的 table2 添加列的情况下获得所需的结果?
【问题讨论】:
试试withColumn("IND", when(col("phone").isNotNull, "Y").otherwise("N"))
。
我在我的 table2 中添加了一个电话列并试图实现这一点......你的逻辑成功了。
但是他们无论如何都没有添加额外的列来实现这一点
Shankar Koirala 提供的解决方案可能看起来更干净一些,我建议您改用它:)
感谢 Shaido 的快速解决方案
【参考方案1】:
您可以在table2
中添加一个新列,默认值为"Y"
和join
,并将null
值替换为"N"
val df1 = Seq(
(1, "sudheer"),
(2, "sandeep"),
(3, "suresh")
).toDF("id", "name")
val df2 = Seq(1, 2).toDF("id")
.withColumn("IND", lit("Y"))
val df3 = df1.join(df2, Seq("id"), "left_outer")
.na.fill("N")
或者你可以像以前一样使用when
val df3 = df1.join(df2, Seq("id"), "left_outer")
.withColumn("IND", when($"IND".isNull, "N").otherwise("Y"))
希望这会有所帮助!
【讨论】:
这个命令有什么作用? val df3 = df1.join(df2,Seq("id"),"left_outer") .na.fill("N") 它替换了您在fill()
方法中提供的 null
值。
知道了..谢谢尚卡尔。
太好了,很高兴能帮到你:)以上是关于使用 scala 基于两个数据框的连接列创建新列的主要内容,如果未能解决你的问题,请参考以下文章