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:在日期值之后【问题讨论】:
col
s 的规则是什么? 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:根据日期拆分列的主要内容,如果未能解决你的问题,请参考以下文章
Oracle Regexp 根据第一次出现的分隔符拆分字符串