使用scala和spark将数组列的行与另一个Dataframe的头进行比较

a7qyws3x  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(540)

我用的是scala和spark。我有两个Dataframe。
第一种是这样的:

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

第二种是Dataframe头

num1, num2, a, b, c, d

我通过添加所有可能的头列创建了一个case类。
现在我想要的是,通过匹配num1和num2列,我必须检查arr列中的数组是否包含第二个Dataframe的头。如果是这样,则值应为1,否则为0。
所以所需的输出是:

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

baubqpgj1#

如果我理解正确,您希望转换数组列 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|
+----+----+---+---+---+---+

相关问题