将转换应用于 Spark Scala 中的列

Applying transformation to column in Spark Scala

将以下转换应用于 Spark 2.40 Scala 中数据框中的列的最佳方法是什么。我正在尝试 udf 或 regex 替换但无法达到预期的结果。

column_1 在下面的例子中是一个字符串。

数据框输入:

column_1
#;#;Runner#;#;bob
#;#;#;

期望的结果

column_1
null#;null#;Runner#;null#;bob
null#;null#;null

解决方案:

遵循以下建议。这就是我解决问题的方式。在这种情况下,我先用逗号替换,然后用 #;

替换逗号分隔符
select_df
  .withColumn("column_1", regexp_replace(col("column_1"), "(?<![a-zAZ0-9]),", "null,"))
  .withColumn("column_1", regexp_replace(col("column_1"), ",]$", ",null"))
  .withColumn("column_1", regexp_replace(col("column_1"), ",", "#;"))

您可以使用 regexp_replace 2 次以获得所需的输出。首先,替换#; (只有 #; 之前没有使用 negative look behind regex expression 的 Runner) by null#;然后替换结尾#;空字符串。

  val spark = SparkSession.builder().master("local[*]").getOrCreate()
  import spark.implicits._
  spark.sparkContext.setLogLevel("ERROR")

  val df = List("#;#;Runner#;#;bob", "#;#;#;").toDF(("column_1"))

  df.withColumn("column_1", regexp_replace(
    regexp_replace('column_1, "(?<![a-zA-Z]+)#;", "null#;"),"#;$", "")
  )
    .show(false)
+-----------------------------+
|column_1                     |
+-----------------------------+
|null#;null#;Runner#;null#;bob|
|null#;null#;null             |
+-----------------------------+