Pyspark:使用带有字符串格式的正则表达式过滤数据帧吗?

时间:2017-08-09 00:57:10

标签: regex pyspark apache-spark-sql spark-dataframe pyspark-sql

我已经阅读了几篇关于使用“like”运算符来过滤火花数据帧的帖子,其条件是包含字符串/表达式,但是想知道以下是否是使用%s的“最佳实践”期望的条件如下:

input_path = <s3_location_str>
my_expr = "Arizona.*hot"  # a regex expression
dx = sqlContext.read.parquet(input_path)  # "keyword" is a field in dx

# is the following correct?
substr = "'%%%s%%'" %my_keyword  # escape % via %% to get "%"
dk = dx.filter("keyword like %s" %substr)

# dk should contain rows with keyword values such as "Arizona is hot."

注意

我正在尝试在dx中获取包含表达式my_keyword的所有行。否则,对于完全匹配,我们不需要周围的百分号'%'。

3 个答案:

答案 0 :(得分:16)

根据neeraj的提示,似乎在pyspark中执行此操作的正确方法是:

expr = "Arizona.*hot"
dk = dx.filter(dx["keyword"].rlike(expr))

请注意,dx.filter($&#34;关键字&#34; ...)不起作用,因为(我的版本)pyspark似乎并不支持开箱即用的$命名法。

答案 1 :(得分:6)

尝试如下所述的rlike功能。

df.filter(<column_name> rlike "<regex_pattern>")

例如。

dk = dx.filter($"keyword" rlike "<pattern>")

答案 2 :(得分:0)

我在时间戳记正则表达式中使用了以下内容

expression = r'[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) (2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]'
df1 = df.filter(df['eta'].rlike(expression))