Spark Regexp:根据日期拆分列

Posted

技术标签:

【中文标题】Spark Regexp:根据日期拆分列【英文标题】:Spark Regexp: Split column based on date 【发布时间】:2017-11-29 19:15:51 【问题描述】:

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

"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", "(.+\")(\\d1,2\\/\\d1,2\\/\\d1,2)(.+)", 1) 看看它是否有效吗? 哇!好的,这让我获得了第一列,不知道如何让其他列工作。 【参考方案1】:

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

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

你需要的正则表达式是:

/(.+")(\d1,2\/\d1,2\/\d1,2)(.+)/

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

regexp_extract($"data", "(.+\")(\\d1,2\\/\\d1,2\\/\\d1,2)(.+)", <b>N</b>)

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

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

【讨论】:

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

感谢@mateus 的所有帮助!!

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

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

【讨论】:

以上是关于Spark Regexp:根据日期拆分列的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 根据日期将数据框拆分为多个数据框?

Oracle Regexp 根据第一次出现的分隔符拆分字符串

根据日期将数据框拆分为两个

根据 Spark 中的小时数拆分时间戳间隔

如何根据日期列在不同的文本/csv文件中转储一个巨大的mysql表?

Oracle根据逗号拆分字段内容转成多行