【问题标题】:Compare rows of an array column with the headers of another data frame using Scala and Spark使用 Scala 和 Spark 将数组列的行与另一个数据帧的标题进行比较
【发布时间】:2020-12-25 20:21:39
【问题描述】:

我正在使用 Scala 和 Spark。 我有两个数据框。

第一个如下:

+------+------+-----------+
| num1 | num2 |    arr    |
+------+------+-----------+
|   25 |   10 | [a,c]     |
|   35 |   15 | [a,b,d]   |
+------+------+-----------+

在第二个中,数据帧头是

num1, num2, a, b, c, d

我通过添加所有可能的标题列创建了一个案例类。

现在我想要的是,通过匹配列 num1 和 num2,我必须检查是否 arr 列中的数组包含第二个数据帧的标题。 如果是这样,则该值应为 1,否则为 0。

所以需要的输出是:

+------+------+---+---+---+---+
| num1 | num2 | a | b | c | d |
+------+------+---+---+---+---+
|   25 |   10 | 1 | 0 | 1 | 0 |
|   35 |   15 | 1 | 1 | 0 | 1 |
+------+------+---+---+---+---+

【问题讨论】:

    标签: arrays scala dataframe apache-spark match


    【解决方案1】:

    如果我理解正确,您希望将数组列 arr 转换为每个可能值一列,其中包含数组是否包含该值。

    如果是这样,您可以像这样使用array_contains 函数:

    val df = Seq((25, 10, Seq("a","c")), (35, 15, Seq("a","b","d")))
                 .toDF("num1", "num2", "arr")
    
    val values = Seq("a", "b", "c", "d")
    df
        .select(Seq("num1", "num2").map(col) ++
                values.map(x => array_contains('arr, x) as x) : _*)
        .show
    
    +----+----+---+---+---+---+
    |num1|num2|  a|  b|  c|  d|
    +----+----+---+---+---+---+
    |  25|  10|  1|  0|  1|  0|
    |  35|  15|  1|  1|  0|  1|
    +----+----+---+---+---+---+
    

    【讨论】:

    • 如果我的第一个数据框中有多个“arr”列,是否可以使用上面的代码?如果是这样,我应该做出哪些改变?
    • 如果 arr_cols 是这些数组列的列表,您可以执行values.map(x => arr_cols.map(arr => array_contains(col(arr), x))).reduce(_ || _).alias(x)) 之类的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2020-08-13
    相关资源
    最近更新 更多