Spark Regexp:根据日期拆分列

时间:2017-11-29 19:15:52

标签: regex scala apache-spark

我的数据框中有一个名为" data"的列,如下所示:

{"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))

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

非常感谢!! :)

列的编辑规则:

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

2 个答案:

答案 0 :(得分:2)

好的,正如你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})(.+)", N)

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

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))

答案 1 :(得分:1)

感谢@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))!