Spark-拆分后如何将新列追加到原始数据框?

时间:2019-04-15 12:39:48

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

我想将DataFrame(col3)的一列拆分为多列(col_acol_bcol_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")

3 个答案:

答案 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"))