Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Regexp:基于日期拆分列_Regex_Scala_Apache Spark - Fatal编程技术网

Spark Regexp:基于日期拆分列

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

在我的数据框中有一个名为“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/)”,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))!