如何在Spark SQL中使用正则表达式提取URL中的指定字段
Spark SQL 正则提取URL目标字段实现方案
你可以直接使用Spark SQL内置的regexp_extract函数完成提取,不需要自定义UDF,该函数的语法规则为:regexp_extract(待匹配字符串列, 正则表达式, 捕获组序号)
其中第三个参数传1即可,你编写的正则中第一个捕获组对应的就是需要提取的目标名称。
注意事项
首先建议你修正正则的笔误:将捕获组内的[a-zA-z]改为[a-zA-Z],原写法会额外匹配[、\、]、^、_、这些非字母的ASCII字符,可能产生异常匹配结果。
另外在Spark SQL的字符串中写正则时,反斜杠\需要做转义,单个\要写成\\才能生效。
使用示例
纯Spark SQL语句写法
假设存储URL的表名为url_table,URL字段名为url_str:
SELECT url_str, regexp_extract(url_str, 'https:\\/\\/xxx\\.xxxxxx\\.com\\/xxxxx\\/(?:[^0-9\\/]+)\\/([a-zA-Z]*)', 1) AS target_name FROM url_table -- 如果需要过滤匹配失败的行可以加下面的条件 -- WHERE target_name <> ''
PySpark DataFrame API写法
from pyspark.sql.functions import regexp_extract # df为已加载的包含URL字段的DataFrame result_df = df.withColumn( "target_name", regexp_extract("url_str", r"https:\/\/xxx\.xxxxxx\.com\/xxxxx\/(?:[^0-9\/]+)\/([a-zA-Z]*)", 1) )
Scala DataFrame API写法
import org.apache.spark.sql.functions.regexp_extract val resultDf = df.withColumn( "target_name", regexp_extract(col("url_str"), "https:\\/\\/xxx\\.xxxxxx\\.com\\/xxxxx\\/(?:[^0-9\\/]+)\\/([a-zA-Z]*)", 1) )
内容的提问来源于stack exchange,提问作者ACCazacu
相关产品推荐
相关产品推荐

