我在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获得上述输出。
答案 0 :(得分:2)
使用array,explode和drop
函数可以为您提供所需的输出
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
它