繁体   English   中英

如何基于第二个DataFrame(Java)在Spark DataFrame中创建新列?

[英]How to create a new column in a Spark DataFrame based on a second DataFrame (Java)?

我有两个Spark DataFrame,其中一个具有两个col,id和Tag。 第二个DataFrame具有一个id col,但是缺少Tag。 第一个Dataframe本质上是一个字典,每个id出现一次,而在第二个DataFrame中,id可能出现几次。 我需要的是在第二个DataFrame中创建一个新的col,该标签的Tag是每行(在第二个DataFrame中)id的函数。 我认为可以通过首先将RDD转换为..etc来完成,但是我认为使用DataFrames(在Java中)必须有更优雅的方式。 示例:给定df1 Row-> id:0,标签:“ A”df2 Row1-> id:0,标签:nulldf2 Row2-> id:0,标签:“ B” ,我需要创建如果df2标签为空,则结果DataFrame df3中的Tag col等于df1(id = 0)=“ A”,但如果不为null,则保留原始标签=>导致df3 Row1-> id:0,Tag:“ A”df3 Row2-> id:0,Tag:“ B” 希望例子清楚。

|   ID  |   No.   |  Tag  | new Tag Col |
|    1  |  10002  |   A   |      A      |
|    2  |  10003  |   B   |      B      | 
|    1  |  10004  | null  |      A      |
|    2  |  10005  | null  |      B      |

您所需要做的就是离开外部联接并coalesce

import org.apache.spark.sql.functions.coalesce

val df = sc.parallelize(Seq(
  (1, 10002, Some("A")), (2, 10003, Some("B")),
  (1, 10004, None), (2, 10005, None)
)).toDF("id", "no", "tag")

val lookup = sc.parallelize(Seq(
  (1, "A"), (2, "B")
)).toDF("id", "tag")


df.join(lookup, df.col("id").equalTo(lookup.col("id")), "leftouter")
  .withColumn("new_tag", coalesce(df.col("tag"), lookup.col("tag")))

这应该几乎与Java版本相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM