繁体   English   中英

使用 Scala 和 Spark 将列表值与案例类进行比较

[英]Compare a list values with case class using Scala and Spark

我有一个如下所示的数据框。

+-------+------+-------+-------+
| num1  | num2 |   x   |   y   |
+-------+------+-------+-------+
|    25 |   10 | a&c   | i&j&k |
|    35 |   15 | a&b&d | i&k   |
+-------+------+-------+-------+

我有另一个带有标题的数据帧结构,例如,

num1, num2, a, b, c, d, i, j, k

我想从符号“&”中拆分 x 和 y 的列数据。 然后检查拆分数据是否与上面的标题匹配,还要考虑列 num1 和 num2。 如果是这样,则用 1 填充值,否则用 0 填充。

所需的输出是:

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

我已经通过以下方法实现了上述输出。 我创建了另一个与第一个数据帧相同的数据帧,但 x 和 y 包含一个拆分数据数组,如下所示。

+------+-------+---------+---------+
| num1 | num2  |    x    |    y    |
+------+-------+---------+---------+
|   25 |    10 | [a,c]   | [i,j,k] |
|   35 |    15 | [a,b,d] | [i,k]   |
+------+-------+---------+---------+

然后按照这个问题中的解决方案

虽然它给了我确切的解决方案,但当涉及到像 x 和 y 这样的列很多的情况时,它是无效的。

所以现在我想创建一个案例类,并通过将它们拆分为一个列表来将标题值与 x,y 列中的数据进行匹配。 是否有可能或有其他解决方案? 有人能帮我吗?

最后尝试了几种方法后,我想出了以下解决方案。 我通过对这个问题的答案添加一些更改找到了我的解决方案: 使用 Scala 和 Spark 将数组列的行与另一个数据帧的标题进行比较 它也适用于多个数组列。 这是它的代码。

 val df = Seq((25, 10, "a&c", "i&j&k"), (35, 15, "a&b&d", "i&k")
      .toDF("num1", "num2", "x", "y")
  val dfProcessed = df.withColumn("x", split($"x", "&"))
      .withColumn("y", split($"y", "&"))
      .select("num1", "num2", "x", "y")

    val headers = Seq("a", "b", "c", "d", "i", "j", "k")
    val report = dfProcessed.select(Seq("num1", "num2").map(col) ++ headers.map(line => array_contains('x, line)
      || array_contains('y, line) as line) : _*)

    report.show()

我想这可能对你有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM