Spark 数据框列上的正则表达式

标签 regex scala apache-spark spark-dataframe

有一个数据框,其中一个列中有一个查询作为值,我正在尝试使用正则表达式提取第一组中一个/两个括号之间的值。

我输入的正则表达式是:

select nvl(sum(field1),0), field2, field3 from tableName1 where partition_date='2018-03-13'

输出应该是:

field1

我用来提取值的 Spark Code 是:

target_query = "select nvl(sum(field1),0), field2, field3 from tableName1 where partition_date='2018-03-13'"

val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"),"(?<=\\().*?(?=\\))",0))

但是我得到了

sum(field1

请告诉我如何只提取 field1。我也可能得到 sum(field1) 而不是 nvl(sum(field1),0) 。是否可以使用相同的正则表达式来处理这两种情况?

最佳答案

由于 field1 值总是包含在 sum 中,您可以使用以下正则表达式:

sum\\((.*?)\\)

这将匹配包含在 sum() 中的所有内容。

要获得正确的匹配,您需要的字段 (field1) 必须是查询中的第一个总和(因为您需要在 regexp_extract< 中指定匹配的 groupid/)。事实上,只要它在相同的位置(第一、第二等)就可以正确匹配。例如:

val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"), "sum\\((.*?)\\)", 1))

末尾的 1 表示提取第一个捕获组中的所有内容。

关于 Spark 数据框列上的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623567/

相关文章:

ios - 正则表达式非常适合主题标签和@usernames 但不适用于 URL

PHP 正则表达式输出转换

scala - pyspark 与 scala 中的 FPgrowth 计算关联

apache-spark - 重新启动从 Delta 表读取数据的结构化流查询时更改过滤器/where 条件

scala - Spark RDD : filling inregular time series

ruby - 如何使用正则表达式选择由相同字母组成的单词?

regex - wordpress 网站上 ModSecurity 的 Apache LocationMatch 通配符

scala - 算法混合

scala - 从 Scala 文件创建可执行 jar 的问题

apache-spark - 如何在另一个 pyspark 应用程序中访问全局临时 View ?