我有一个列名称为“ Name”的数据框。我需要在具有500万行的另一个表中查找该名称,并在“名称列”中获取匹配值的最新时间戳,如果找到行,则设置标志列。
例如数据框DF具有以下值
ID Name City
01 XXXX Austin
02 YYYY Atlanta
现在,我需要阅读Name并根据另一个表的查询结果添加2个新列。这是查询表时需要考虑的要点 1.如果找到匹配名称的行,则将标志的列添加为“是”或“否” 2.从名称匹配的表中获取最新的时间戳(表中可能有多行具有相同的名称,但是它将具有不同的时间戳)
最终输出数据框应如下所示:
ID Name City Flag timestamp
01 XXXX Austin Yes 2018-06-20 00:00:00
02 YYYY Atlanta No
请帮助我在Spark Scala中实现这一目标。
答案 0 :(得分:0)
这将在某种程度上取决于您使用的Spark版本,也将有一些FYI,从版本2开始不推荐使用数据框。
据我所知,如果表1是df1,表2是df2,则您希望将df2过滤到最新行。接下来,您要在df1上使用左外部连接df2。然后,您要创建一个“标志”列,如果存在匹配项,则将其设置为“是”,否则将其设置为“否”。
下面的代码应该是您所寻找的东西。
val df1 = //Get dataframe one
val df2 = //Get dataframe two
val filteredDf2 = df2.groupBy("name")
.agg(max("timestamp").as("timestamp"))
.withColumn("Flag", lit("Yes"))
val joinedDfs = df1.join(df1("name") === filteredDf2("name"), "left_outer")
.select(
df1("id"),
df1("name"),
filteredDf2("Flag"),
filteredDf2("timestamp")
)
val replaceNullFlags = joinedDfs.fill("No")
这显然是假设其余数据都不为空。