带有scala的spark2.2.0中的Regexp_extract抛出错误

Posted

技术标签:

【中文标题】带有scala的spark2.2.0中的Regexp_extract抛出错误【英文标题】:Regexp_extract in spark2.2.0 with scala throws error 【发布时间】:2018-09-28 14:24:32 【问题描述】:

我的代码如下,

val y = Seq(("100-200"),("300-400"),("500-600")).toDF("numbersData") .withColumn("extractedData",regexp_extract($"numbersData","(\d+)-(\d+)",1)) 我想将“extractedData”列输出为,

100 300 500

但是我得到了错误,

error: invalid escape character .withColumn("extractedData",regexp_extract($"numbersData","(\d+)-(\d+)",1)) ^

请指导

【问题讨论】:

必须使用双重转义:"(\\d+)-(\\d+)" 【参考方案1】:

正如其他人所指出的,在您的正则表达式模式"(\\d+)-(\\d+)" 中使用双反斜杠将解决问题——尽管不需要像这样简单模式的正则表达式。相反,您可以使用split:

df.withColumn("extractedData", split($"numbersData", "-")(0)).show
// +-----------+-------------+
// |numbersData|extractedData|
// +-----------+-------------+
// |    100-200|          100|
// |    300-400|          300|
// |    500-600|          500|
// +-----------+-------------+

请注意,Regexsplit 解决方案都将生成 StringType 列。如有必要,您也可以申请cast("Int") 来制作IntegerType 的新列。

【讨论】:

谢谢! Leo C,你的回答帮助我从不同的角度看待问题。【参考方案2】:

您需要转义反斜杠。试试这个

scala> val y = Seq(("100-200"),("300-400"),("500-600")).toDF("numbersData").withColumn("extractedData",regexp_extract($"numbersData","(\\d+)-(\\d+)",1)).show()
+-----------+-------------+
|numbersData|extractedData|
+-----------+-------------+
|    100-200|          100|
|    300-400|          300|
|    500-600|          500|
+-----------+-------------+

y: Unit = ()

scala>

【讨论】:

谢谢!非常堆栈0114106。

以上是关于带有scala的spark2.2.0中的Regexp_extract抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

Spark 2.2.0 的兼容 Scala 版本?

如何切换到不同版本的 Scala? (苹果系统)

Spark 2.2.0 - 加载特定的文件列表

无法过滤存储在 spark 2.2.0 数据框中的 CSV 列

spark 学习笔记-spark2.2.0

Spark2.2.0 java在pom.xml 引入 mllib库