【问题标题】:Scala Spark - Map function referencing another dataframeScala Spark - 引用另一个数据帧的映射函数
【发布时间】:2016-11-10 05:46:03
【问题描述】:

我有两个数据框:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 既然你用scala标记了这个问题===是一个正确的运算符。
    • 是的,你是对的。我不知道=== 并认为这是一个错字。我把它改正回来了,它现在可以工作了! - =====有什么区别?
    • === 是一个 SQL 等式。 == 比较没有真正意义的列对象。
    • 你的简单回答(以及 scala 的表现力)真的让我大吃一惊:)
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    相关资源
    最近更新 更多