Scala Spark - 引用另一个数据帧的映射函数

标签 scala apache-spark dataframe apache-spark-sql

我有两个数据框:

df1:

+---+------+----+
| 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 中。

df_output:

+---+------+----+---+
| 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|
+---+------+----+---+

到目前为止,我的理解是我必须创建一个采用 'id 列的 udf和'time作为输入,map对于每一行,引用 df2.filter(df2.id == df1.id, df1.time >= df2.t_start, df1.time <= df2.t_end), and get the corresponding df2.t`

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

最佳答案

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

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

关于Scala Spark - 引用另一个数据帧的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38253403/

相关文章:

python - 如何将 timedelta 转换为小时

存在类型和类型成员的 Scala 类型推断

apache-spark - 如何设置 spark 使用特定数量的内核?

hadoop - 在任何时间范围内进行统计的唯一身份访问者都算在内吗?

R:将多行重新组合为一行(按第一列中的值)

python - 如何将Python pandas数据保存到Excel文件中?

scala - Spark 指数移动平均线

scala - 创建数据框时面对 "scala.MatchError: 1201 (of class java.lang.Integer)"

scala - 如何设置 Play! 的 POST header 2.0 web服务查询?

azure - Spark 将检索到的数据保存在 Azure Databricks 上的什么位置?