使用 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 基于两个数据框的连接列创建新列的主要内容,如果未能解决你的问题,请参考以下文章

spark scala - UDF 用于创建新列

如何使用 Scala/Spark 添加不基于数据框中现有列的新列? [复制]

将两个数据库列连接到一个结果集列

在数据框的新列中需要词频 // scala

将数据框的新列分配给与其他数据框匹配的值[重复]

如何在scala spark中将数据框的特定列与另一个列连接[重复]