spark:将多列分解为一列

rur96b6h  于 2021-05-19  发布在  Spark
关注(0)|答案(2)|浏览(442)

有没有可能在spark中将多个列分解成一个新列?我有一个Dataframe,看起来像这样:

userId         varA     varB
   1         [0,2,5]   [1,2,9]

期望输出:

userId     bothVars
   1         0     
   1         2     
   1         5  
   1         1  
   1         2  
   1         9

到目前为止,我尝试了:

val explodedDf = df.withColumn("bothVars", explode($"varA")).drop("varA")
                   .withColumn("bothVars", explode($"varB")).drop("varB")

这是行不通的。如有任何建议,我们将不胜感激。

noj0wjuj

noj0wjuj1#

你可以把两个数组 Package 成一个数组 flatten 在分解嵌套数组之前,先将其分解,如下所示:

val df = Seq(
  (1, Seq(0, 2, 5), Seq(1, 2, 9)),
  (2, Seq(1, 3, 4), Seq(2, 3, 8))
).toDF("userId", "varA", "varB")

df.
  select($"userId", explode(flatten(array($"varA", $"varB"))).as("bothVars")).
  show
// +------+--------+
// |userId|bothVars|
// +------+--------+
// |     1|       0|
// |     1|       2|
// |     1|       5|
// |     1|       1|
// |     1|       2|
// |     1|       9|
// |     2|       1|
// |     2|       3|
// |     2|       4|
// |     2|       2|
// |     2|       3|
// |     2|       8|
// +------+--------+

请注意 flatten spark提供 2.4 +.

gmxoilav

gmxoilav2#

使用 array_union 然后使用 explode 功能。

scala> df.show(false)
+------+---------+---------+
|userId|varA     |varB     |
+------+---------+---------+
|1     |[0, 2, 5]|[1, 2, 9]|
|2     |[1, 3, 4]|[2, 3, 8]|
+------+---------+---------+
scala> df
.select($"userId",explode(array_union($"varA",$"varB")).as("bothVars"))
.show(false)

+------+--------+
|userId|bothVars|
+------+--------+
|1     |0       |
|1     |2       |
|1     |5       |
|1     |1       |
|1     |9       |
|2     |1       |
|2     |3       |
|2     |4       |
|2     |2       |
|2     |8       |
+------+--------+
``` `array_union` spark提供 `2.4+` 

相关问题