如何从spark scala中的一行获取多行

时间:2017-08-31 10:57:19

标签: scala apache-spark apache-spark-sql

我在spark中有一个数据框,如下所示,我希望转换不同行中的所有列,而不是第一列id。

+----------------------------------+
| id code1 code2 code3 code4 code5 |
+----------------------------------+
| 1 A B C D E                      |
| 1 M N O P Q                      |
| 1 P Q R S T                      |
| 2 P A C D F                      |
| 2 S D F R G                      |
+----------------------------------+

我想要输出如下格式

+-------------+
|     id code |
+-------------+
|     1 A     |
|     1 B     |
|     1 C     |
|     1 D     |
|     1 E     |
|     1 M     |
|     1 N     |
|     1 O     |
|     1 P     |
|     1 Q     |
|     1 P     |
|     1 Q     |
|     1 R     |
|     1 S     |
|     1 T     |
|     2 P     |
|     2 A     |
|     2 C     |
|     2 D     |
|     2 F     |
|     2 S     |
|     2 D     |
|     2 F     |
|     2 R     |
|     2 G     |
+-------------+

任何人都可以在这里帮助我如何通过spark和scala获得上述输出。

2 个答案:

答案 0 :(得分:2)

使用arrayexplodedrop函数可以为您提供所需的输出

df.withColumn("code", explode(array("code1", "code2", "code3", "code4", "code5")))
    .drop("code1", "code2", "code3", "code4", "code5")

OR

undefined_variable 定义,您只需使用select

df.select($"id", explode(array("code1", "code2", "code3", "code4", "code5")).as("code"))

答案 1 :(得分:1)

df.select(col("id"),explode(concat_ws(",",Seq(col(code1),col("code2"),col("code3"),col("code4"),col("code5")))))

基本上,想法首先是concat所有必需的列,然后是explode