如何使用scala获得此功能

时间:2017-09-14 03:46:01

标签: scala apache-spark spark-dataframe

**DF1**   **DF2**            **output_DF**
120 D        A               120  null  A
120 E        B               120  null  B
125 F        C               120  null  C
             D               120   D    D
             E               120   E    E
             F               120  null  F
             G               120  null  G
             H               120  null  H
                             125  null  A
                             125  null  B
                             125  null  C
                             125  null  D
                             125  null  E
                             125   F    F
                             125  null  G
                             125  null  H

从数据帧1和2需要获得spark-shell中的最终输出数据帧。 其中A,B,C,D,E,F是日期格式(yyyy-MM-dd)& 120,125是ticket_id的列,其中有数千个ticket_id。 我刚刚在这里提取了一个。

2 个答案:

答案 0 :(得分:0)

要获得预期结果,您可以使用df.join()df.na.fill()(如评论中所述),如下所示:

适用于Spark 2.0 +

val resultDF = df1.select("col1").distinct.collect.map(_.getInt(0)).map(id => df1.filter(s"col1 = $id").join(df2, df1("col2") === df2("value"), "right").na.fill(id)).reduce(_ union _)

适用于Spark 1.6

val resultDF = df1.select("col1").distinct.collect.map(_.getInt(0)).map(id => df1.filter(s"col1 = $id").join(df2, df1("col2") === df2("value"), "right").na.fill(id)).reduce(_ unionAll _)

它会给你以下结果 -

+---+----+-----+
|120|null|    A|
|120|null|    B|
|120|null|    C|
|120|   D|    D|
|120|   E|    E|
|120|null|    F|
|120|null|    G|
|120|null|    H|
|125|null|    A|
|125|null|    B|
|125|null|    C|
|125|null|    D|
|125|null|    E|
|125|   F|    F|
|125|null|    G|
|125|null|    H|
+---+----+-----+

我希望它有所帮助!

答案 1 :(得分:0)

可能值的完全连接,然后左连接原始数据帧:

import hiveContext.implicits._
val df1Data = List((120, "D"), (120, "E"), (125, "F"))
val df2Data = List("A", "B", "C", "D", "E", "F", "G", "H")
val df1 = sparkContext.parallelize(df1Data).toDF("id", "date")
val df2 = sparkContext.parallelize(df2Data).toDF("date")

// get unique ID: 120, 125
val uniqueIDDF = df1.select(col("id")).distinct()
val fullJoin = uniqueIDDF.join(df2)
val result = fullJoin.as("full").join(df1.as("df1"), col("full.id") === col("df1.id") && col("full.date") === col("df1.date"), "left_outer")

val sorted = result.select(col("full.id"), col("df1.date"), col("full.date")).sort(col("full.id"), col("full.date"))
sorted.show(false)

输出:

+---+----+----+
|id |date|date|
+---+----+----+
|120|null|A   |
|120|null|B   |
|120|null|C   |
|120|D   |D   |
|120|E   |E   |
|120|null|F   |
|120|null|G   |
|120|null|H   |
|125|null|A   |
|125|null|B   |
|125|null|C   |
|125|null|D   |
|125|null|E   |
|125|F   |F   |
|125|null|G   |
|125|null|H   |
+---+----+----+

这里排序只是为了显示相同的结果,可以跳过。