首页 > 解决方案 > 使用一个 when 子句添加多个列

问题描述

我有一个看起来像这样的代码:

df.withColumn( colPath , when( col(colType) =!= S_IFLNK_name, regexp_extract(col(tempColPath) , exp = "^(.*\\/).*$", groupIdx = 1 ) )
                                   .otherwise( regexp_extract( col(tempColPath), exp = "^(.*\\/)(?:[^\\/]+\\-\\>.*)$", groupIdx = 1 ) ) )
         .withColumn( colFilename, when( col(colType) =!= S_IFLNK_name, regexp_extract(col(tempColPath), exp = "^(?:.*\\/)(.*)$", groupIdx = 1 ) )
                                   .otherwise( regexp_extract( col(tempColPath), exp = "^(?:.*\\/)([^\\/]+\\-\\>.*)$", groupIdx = 1 ) ) )

没有必要理解该代码,但我的目标是能够只使用一个 when 子句并一次添加 2 列。
进行两次此测试以添加一列是一个可怕的性能问题,有可能吗?
我尝试使用match case,但您不能将它们应用于Columns值。

标签: scalaapache-spark

解决方案


从火花文档withColumn:(https://spark.apache.org/docs/2.4.4/api/java/org/apache/spark/sql/Dataset.html#withColumn-java.lang.String-org.apache。 spark.sql.Column- ):

通过添加列或替换具有相同名称的现有列来返回新数据集。

因此,.withColumn对需要添加的每个新列使用 a。

yourDF
  .withColumn("new_column",
    when($"old_column".isNull, lit("new_column_true_value"))
      .otherwise($"new_column_false_value"))
  .withColumn("new_column_2",
    when($"old_column_2".isNull, lit("new_column_2_true_value"))
      .otherwise($"new_column_2_false_value"))

推荐阅读