【问题标题】:Pyspark: filter dataframe by regex with string formatting?Pyspark:通过带有字符串格式的正则表达式过滤数据帧?
【发布时间】:2018-01-16 17:11:39
【问题描述】:

我已经阅读了几篇关于使用“like”运算符通过包含字符串/表达式的条件过滤 spark 数据帧的文章,但想知道以下是否是在所需条件如下:

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 的行。否则,对于完全匹配,我们不需要周围的百分号 '%'。

【问题讨论】:

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


    【解决方案1】:

    尝试如下所述的 rlike 函数。

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

    例如。

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

    【讨论】:

    • 这是 Scala 吗? Pyspark 似乎不支持col rlike expr 语法。
    【解决方案2】:

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

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

    请注意,dx.filter($"keyword" ...) 不起作用,因为(我的版本)pyspark 似乎不支持开箱即用的$ 命名法。

    【讨论】:

      【解决方案3】:

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

      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))
      

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 2021-07-11
        • 2013-09-23
        • 2021-06-06
        • 1970-01-01
        相关资源
        最近更新 更多