Spark Regexp:基于日期拆分列
在我的数据框中有一个名为“data”的列,如下所示:Spark Regexp:基于日期拆分列,regex,scala,apache-spark,Regex,Scala,Apache Spark,在我的数据框中有一个名为“data”的列,如下所示: {“blah:“blah”,“blah”:“blah”“”17年7月10日服务 我想将其分为三个不同的列,如下所示: col1:{“诸如此类”,“诸如此类”:“诸如此类” col2:10/7/17 col3:服务 我尝试过这种方法: val separate=df.withColumn(“col1”,regexp|u extract($“data”),“(/(0[1-9]|[12][0-9]|[3[01])[-\/(19 | 20)\d\d
{“blah:“blah”,“blah”:“blah”“”17年7月10日服务
我想将其分为三个不同的列,如下所示:
col1:{“诸如此类”,“诸如此类”:“诸如此类”
col2:10/7/17
col3:服务
我尝试过这种方法:
val separate=df.withColumn(“col1”,regexp|u extract($“data”),“(/(0[1-9]|[12][0-9]|[3[01])[-\/(19 | 20)\d\d/)”,1)
.withColumn(“col2”,regexp|u extract($”data“,”(/(0[1-9]| 1[012])[-\/.](0[1-9]|[12][0-9]| 3[01])[-\/.](19 | 20)\d/),2))
但是这个正则表达式并不能真正让我通过这扇门。我觉得我错过了一些关于正则表达式操作符在Spark中如何工作的信息。有什么想法吗
非常感谢!!:)
编辑列的规则:
- col1:在日期值之前
- col2:日期值
- col3:在datevalue之后
:匹配直到找到最后一个col1
“
:匹配日期col2
:字符串的其余部分col3
- 好的,正如你所说,规则是:
/(.+")(\d{1,2}\/\d{1,2}\/\d{1,2})(.+)/
但是,当您在regexp\u extract()
函数中使用它时,必须转义反斜杠,因此对于每一列,您将使用:
regexp_extract($"data", "(.+\")(\\d{1,2}\\/\\d{1,2}\\/\\d{1,2})(.+)", N)
感谢@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))!
col
s的规则是什么?col1
:匹配直到找到最后一个“
,col2
:日期和col3
:字符串的其余部分?这就是你想要的吗?是的,正则表达式可以工作!但是我如何在spark scala代码中工作呢?我试着用它作为模式,但效果不太好。我不是scala专家,但你能试着使用regexp\u extract($“data”,“(.+\”)(\\d)吗{1,2}\\\/\\d{1,2}\\/\\d{1,2})(.+)”,1)
看看它是否有效?哇!好吧,这让我得到了第一个专栏,但不知道如何让其他专栏发挥作用。我们同时发布了!谢谢!!这是:)@mateaus,我该如何做才能使它匹配到col1的日期?因为如果前面没有疯狂的json,那么这样做会让专栏崩溃。因为在\”
替换为:?
,因此:(.+?)
将与json匹配。
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))!