【问题标题】:Spark Regexp: Split column based on dateSpark Regexp:根据日期拆分列
【发布时间】:2026-01-21 06:15:01
【问题描述】:

我的数据框中有一列名为“数据”,如下所示:

{"blah:"blah","blah":"blah"""10/7/17service

我想将其分成三个不同的列,如下所示:

col1: {"blah:"blah","blah":"blah""" col2: 10/7/17 col3: service

我已经尝试过这种方法:

val separate = df.withColumn("col1", regexp_extract($"data", "(/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/)", 1) .withColumn("col2",regexp_extract($"data", "(/(0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])[- \/.](19|20)\d\d/)", 2))

但是这个正则表达式并没有真正让我通过门。我觉得我错过了一些关于 regex 运算符在 Spark 中的工作方式。有什么想法吗?

非常感谢!! :)

列的编辑规则:

  • col1:日期值之前
  • col2:日期值
  • col3:在日期值之后

【问题讨论】:

  • cols 的规则是什么? col1:匹配直到找到最后一个"col2:日期和col3:字符串的其余部分?这是你想要的regex101.com/r/TK2LrZ/1吗?
  • 是的,正则表达式有效!但是我如何在 spark scala 代码中实现它呢?我尝试将其用作模式,但效果不佳。
  • 我不是 scala 专家,但您可以尝试使用 regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 1) 看看它是否有效吗?
  • 哇!好的,这让我获得了第一列,不知道如何让其他列工作。

标签: regex scala apache-spark


【解决方案1】:

好的,就像你confirmed 一样,规则是:

  • col1:匹配直到找到最后一个"
  • col2:匹配日期
  • col3:字符串的其余部分

你需要的正则表达式是:

/(.+")(\d{1,2}\/\d{1,2}\/\d{1,2})(.+)/

但是,当您在 regexp_extract() 函数上使用它时,您必须转义反斜杠,因此对于每一列,您将使用:

regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", <b>N</b>)

根据您编写的代码,尝试使用:

val separate = df.withColumn("col1", regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 1)).withColumn("col2",regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 1)).withColumn("col3",regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 3))

【讨论】:

  • 我们同时发帖!谢谢!!会的:)
  • @mateaus,我该怎么做才能匹配到 col1 的日期?因为如果前面没有疯狂的 json,那么这样做会吓坏列。
  • 因为直到" 才匹配,您必须将正则表达式中的\" 替换为:?,因此:(.+?) 将匹配json。
【解决方案2】:

感谢@mateus 的所有帮助!!

现在可以用这个命令让它工作:

val fixed = df.withColumn("left", regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 1)).
  withColumn("middle", regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 2)).
  withColumn("right", regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", 3))!

【讨论】: