我想将DataFrame(col3
)的一列拆分为多列(col_a
,col_b
,col_c
)。并用多列替换单列。
+---------------------------------+
|col1|col2| col3 |col4|col5|col6 |
| a| b| a,b,c | d | n | r |
| d| e| f,f,f | p | b | null|
+---------------------------------+
因此,我通过以下方式拆分列:
val new_DF = original_DF.withColumn("_tmp", split($"col3", "\\,")).select(
$"_tmp".getItem(0).as("col_a"),
$"_tmp".getItem(1).as("col_b"),
$"_tmp".getItem(2).as("col_c")
).drop("_tmp")
但是new_DF
仅包含新的三列。如何在没有original_DF
的情况下使新列成为原始col3
的一部分?
UPD:我已经设法达到了预期的效果,但看起来一点也不漂亮。感谢您提供任何有关改进此方法的建议。
val new_DF = original_DF
.withColumn("col_a", split($"col3", "\\,").getItem(0))
.withColumn("col_b", split($"col3", "\\,").getItem(1))
.withColumn("col_c", split($"col3", "\\,").getItem(2))
.drop("col3")
答案 0 :(得分:2)
无重复:
val withArrayColumn = original_DF.withColumn("col3Array", split($"col3", ","))
val columnNames = Seq("a", "b", "c").zipWithIndex
val result = columnNames
.foldLeft(withArrayColumn)((updated, columnIndex) => updated.withColumn("col_" + columnIndex._1, $"col3Array".getItem(columnIndex._2)))
.drop("col3Array", "col3")
答案 1 :(得分:2)
这应该可以解决问题:
val new_DF = original_DF.withColumn("_tmp", split($"col3", "\\,")).select(
$"_tmp".getItem(0).as("col_a"),
$"_tmp".getItem(1).as("col_b"),
$"_tmp".getItem(2).as("col_c"),
original_DF.columns.filter(_ != "col3"): _*)
)
从original_df
中选择所有不包含col3
的列
答案 2 :(得分:1)
这是一个小改进
val new_DF = original_DF.select(col("col_1"),
col("col_2"),
col("col3").getItem(0).as("col_a"),
col("col3").getItem(1).as("col_b"),
col("col3").getItem(2).as("col_c"),
col("col_4"),
col("col_5"),
col("col_6"))