使用Spark Scala根据配置单元查询结果添加列

时间:2018-06-20 20:28:18

标签: scala apache-spark

我有一个列名称为“ 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中实现这一目标。

1 个答案:

答案 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")

这显然是假设其余数据都不为空。