如何在火花中使用 Regexp_replace

Posted

技术标签:

【中文标题】如何在火花中使用 Regexp_replace【英文标题】:how to use Regexp_replace in spark 【发布时间】:2017-02-26 02:18:34 【问题描述】:

我对 spark 很陌生,想对数据框的列执行操作,以便将列中的所有 , 替换为 .

假设有一个数据框 x 和 x4 列

x4
1,3435
1,6566
-0,34435

我希望输出为

x4
1.3435
1.6566
-0.34435

我使用的代码是

import org.apache.spark.sql.Column
def replace = regexp_replace((x.x4,1,6566:String,1.6566:String)x.x4)

但我收到以下错误

import org.apache.spark.sql.Column
<console>:1: error: ')' expected but '.' found.
       def replace = regexp_replace((train_df.x37,0,160430299:String,0.160430299:String)train_df.x37)

任何有关语法、逻辑或任何其他合适方式的帮助将不胜感激

【问题讨论】:

【参考方案1】:

这是一个可重现的示例,假设 x4 是一个字符串列。

import org.apache.spark.sql.functions.regexp_replace

val df = spark.createDataFrame(Seq(
  (1, "1,3435"),
  (2, "1,6566"),
  (3, "-0,34435"))).toDF("Id", "x4")

语法为regexp_replace(str, pattern, replacement),翻译为:

df.withColumn("x4New", regexp_replace(df("x4"), "\\,", ".")).show
+---+--------+--------+
| Id|      x4|   x4New|
+---+--------+--------+
|  1|  1,3435|  1.3435|
|  2|  1,6566|  1.6566|
|  3|-0,34435|-0.34435|
+---+--------+--------+

【讨论】:

我可以用多个字符代替逗号吗?例如,我想用任何其他字符替换逗号感叹号? 您想用一个字符替换多个特殊字符吗?是的,这是可能的。 我试过但没用。你能告诉我怎么做吗? 你可以试试regexp_replace(df.col, "[\\?,\\.,\\$]", "."))【参考方案2】:

我们可以使用map 方法进行这种转换:

scala> df.map(each =>  
(each.getInt(0),each.getString(1).replaceAll(",", "."))
)
.toDF("Id","x4")
.show

Output:

+---+--------+
| Id|      x4|
+---+--------+
|  1|  1.3435|
|  2|  1.6566|
|  3|-0.34435|
+---+--------+

【讨论】:

以上是关于如何在火花中使用 Regexp_replace的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中使用 regexp_replace() 一次删除多个字符?

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)

在 Hive 中,如何使用“regexp_replace()”对标记值执行通配符搜索,以将其替换为公共值?

如何使用 REGEXP_REPLACE 替换特定条件下的重复单词?

如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换

如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串