火花数据框列上的正则表达式
Regex on spark dataframe column
有一个数据框,其中一个列中有一个查询作为值,我正在尝试使用正则表达式提取第一组中 one/two 括号之间的值。
我输入的正则表达式是:
select nvl(sum(field1),0), field2, field3 from tableName1 where partition_date='2018-03-13'
输出应该是:
field1
我用来提取值的 Spark 代码是:
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
中指定匹配的组 ID) .事实上,只要它在相同的位置(第一、第二等)就可以正确匹配。例如:
val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"), "sum\((.*?)\)", 1))
最后的1表示提取第一个捕获组中的所有内容。
有一个数据框,其中一个列中有一个查询作为值,我正在尝试使用正则表达式提取第一组中 one/two 括号之间的值。
我输入的正则表达式是:
select nvl(sum(field1),0), field2, field3 from tableName1 where partition_date='2018-03-13'
输出应该是:
field1
我用来提取值的 Spark 代码是:
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
中指定匹配的组 ID) .事实上,只要它在相同的位置(第一、第二等)就可以正确匹配。例如:
val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"), "sum\((.*?)\)", 1))
最后的1表示提取第一个捕获组中的所有内容。