【问题标题】:Applying transformation to column in Spark Scala将转换应用于 Spark Scala 中的列
【发布时间】:2021-10-11 11:51:08
【问题描述】:

在 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"), ",", "#;"))

【问题讨论】:

标签: scala dataframe apache-spark apache-spark-sql user-defined-functions


【解决方案1】:

您可以使用 regexp_replace 2 次来获得所需的输出。首先,替换#; (只有#; Runner 之前没有使用negative look behind regex expression) 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             |
+-----------------------------+

【讨论】:

  • 如果值是动态的怎么办?跑步者可能并不总是在同一位置。例如,它可能是不同位置的“骆驼”
  • 您可以像这样更改正则表达式模式 -(?
猜你喜欢
  • 2020-02-09
  • 2019-02-20
  • 2015-12-05
  • 2020-08-11
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2017-06-11
相关资源
最近更新 更多