使用 Scala 和 Spark 将列表值与大小写 class 进行比较
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 |
+-------+------+-------+-------+
我有另一个数据帧结构,header像,
num1, num2, a, b, c, d, i, j, k
我想从符号“&”中拆分x和y的列数据。
然后检查拆分数据是否与上面的 headers 匹配,同时考虑列 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 这样的列很多的情况时,它是无效的。
所以现在我想创建一个案例 class 并将 header 值与 x,y 列中的数据匹配,方法是将它们拆分为一个列表。
是否可能或是否有任何其他解决方案?有人可以帮助我吗?
在尝试了几种方法后,我终于想到了以下解决方案。我通过对这个问题的答案添加一些更改找到了我的解决方案:。它也适用于多个数组列。这是它的代码。
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()
我想这可能对你有帮助。
我有一个如下所示的数据框。
+-------+------+-------+-------+
| num1 | num2 | x | y |
+-------+------+-------+-------+
| 25 | 10 | a&c | i&j&k |
| 35 | 15 | a&b&d | i&k |
+-------+------+-------+-------+
我有另一个数据帧结构,header像,
num1, num2, a, b, c, d, i, j, k
我想从符号“&”中拆分x和y的列数据。 然后检查拆分数据是否与上面的 headers 匹配,同时考虑列 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 这样的列很多的情况时,它是无效的。
所以现在我想创建一个案例 class 并将 header 值与 x,y 列中的数据匹配,方法是将它们拆分为一个列表。 是否可能或是否有任何其他解决方案?有人可以帮助我吗?
在尝试了几种方法后,我终于想到了以下解决方案。我通过对这个问题的答案添加一些更改找到了我的解决方案:
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()
我想这可能对你有帮助。