Regex spark数据帧列上的正则表达式
如果有一个dataframe,其中一列中有一个查询作为值,我将尝试使用regex提取第一个组中一个/两个括号之间的值 我对正则表达式的输入是:Regex spark数据帧列上的正则表达式,regex,scala,apache-spark,spark-dataframe,Regex,Scala,Apache Spark,Spark Dataframe,如果有一个dataframe,其中一列中有一个查询作为值,我将尝试使用regex提取第一个组中一个/两个括号之间的值 我对正则表达式的输入是: 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, fie
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))
请告诉我如何仅提取
字段1
。我可能会得到sum(field1)
而不是nvl(sum(field1),0)
。是否可以使用同一个正则表达式来处理这两种情况?因为字段1
值总是包含一个总和
您可以使用以下正则表达式:
sum\\((.*?)\\)
这将匹配sum()
中包含的所有内容
要获得正确的匹配,需要将所需字段(field1
)作为查询中的第一个和(因为需要在regexp\u extract
中指定匹配的groupid)。事实上,只要它处于相同的位置(第一、第二等),你就可以正确地匹配它。例如:
val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"), "sum\\((.*?)\\)", 1))
末尾的1表示提取第一个捕获组中的所有内容。查询中是否始终只有一个和?是的,查询将只有一个和。
val df1 = df.withColumn("Extract_field", regexp_extract(df("target_query"), "sum\\((.*?)\\)", 1))