提问者:小点点

Scala火花映射函数引用了另一个数据帧


我有两个数据框架:

数据1:

+---+------+----+
| id|weight|time|
+---+------+----+
|  A|   0.1|   1|
|  A|   0.2|   2|
|  A|   0.3|   4|
|  A|   0.4|   5|
|  B|   0.5|   1|
|  B|   0.7|   3|
|  B|   0.8|   6|
|  B|   0.9|   7|
|  B|   1.0|   8|
+---+------+----+

DF2:

+---+---+-------+-----+
| id|  t|t_start|t_end|
+---+---+-------+-----+
|  A| t1|      0|    3|
|  A| t2|      4|    6|
|  A| t3|      7|    9|
|  B| t1|      0|    2|
|  B| t2|      3|    6|
|  B| t3|      7|    9|
+---+---+-------+-----+

我想要的输出是识别 df1 中每个时间戳的“t”,其中“t”的范围在 df2 中。

数据输出(_O):

+---+------+----+---+
| id|weight|time| t |
+---+------+----+---+
|  A|   0.1|   1| t1|
|  A|   0.2|   2| t1|
|  A|   0.3|   4| t2|
|  A|   0.4|   5| t2|
|  B|   0.5|   1| t1|
|  B|   0.7|   3| t2|
|  B|   0.8|   6| t2|
|  B|   0.9|   7| t3|
|  B|   1.0|   8| t3|
+---+------+----+---+

到目前为止,我的理解是,我必须创建一个 udf,它将 'id 和 'time 列作为输入,通过引用 df2.filter(df2.id == df1.id, df1.time

我对Scala和Spark非常陌生,所以我想知道这个解决方案是否可能?


共1个答案

匿名用户

您不能为此使用 UDF,但您所要做的就是重用您已经定义的过滤条件来连接两个帧:

df1.join(
  df2,
  df2("id") === df1("id") && df1("time").between(df2("t_start"), df2("t_end"))
)