我的数据框中有一个名为" 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中如何工作的一些东西。有什么想法吗?
非常感谢!! :)
列的编辑规则:
答案 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))!