【问题标题】:Regex is working in presto SQL but is not working in pyspark expr正则表达式在 presto SQL 中工作,但在 pyspark expr 中不工作
【发布时间】:2021-11-30 08:58:46
【问题描述】:

数据:

+---+-------------------------------------------------------------+
|id |filters                                                      |
+---+-------------------------------------------------------------+
|1  |{"option.p.one":["A","B","C","D"], "option.p.type_two":["1"]}|
+---+-------------------------------------------------------------+

生成数据的代码:

columns = ["id","filters"]
data = [(1, '{"option.p.one":["A","B","C","D"], "option.p.type_two":["1"]}')]

rdd = sc.parallelize(data)

我编写了两个正则表达式来提取和存储此字符串的键和值。

  1. 密钥:\.([a-z_]+)\":'
  2. 值::\[([^:]+)\

现在,当我运行以下代码时,我看到我的值正则表达式没有返回预期的结果。

dfFromRDD2.withColumn("filter_category", expr(f"regexp_extract_all(filters, '\.([a-z_]+)\":', 1)"))\
.withColumn("filter_inputs", expr(f"regexp_extract_all(filters, ':\[([^:]+)\]', 0)")).show(truncate = False)


+---+-------------------------------------------------------------+---------------+-------------+
|id |filters                                                      |filter_category|filter_inputs|
+---+-------------------------------------------------------------+---------------+-------------+
|1  |{"option.p.one":["A","B","C","D"], "option.p.type_two":["1"]}|[one, type_two]|[:[, :[]     |
+---+-------------------------------------------------------------+---------------+-------------+

两个正则表达式在 Presto SQL 中都能正常工作

【问题讨论】:

    标签: sql regex pyspark presto


    【解决方案1】:

    您需要转义python字符串中的特殊字符,例如。

    dfFromRDD2.withColumn("filter_category", expr(f"regexp_extract_all(filters, '\\\.([a-z_]+)\\\":', 1)"))\
    .withColumn("filter_inputs", expr(f"regexp_extract_all(filters, ':\\\[([^:]+)\\\]', 0)")).show(truncate = False)
    
    

    让我知道以上内容是否适合您。

    【讨论】:

    • 成功了,谢谢!你能详细说明为什么这在 Presto 和 Python 中有效吗?
    • 在 presto 中,您将按原样使用模式运行查询。我在我的经验中发现的,正如你所看到的,使用 pyspark 很容易重现 \` character has to be escaped as \\` 也使得预期的转义字符(例如 \.\[)不会被转义在被发送到执行引擎之前。也许\\\[ 作为输入变成\\[ 然后\[ 在转义期间。我不确定这种行为是否是 py4j 的结果,但这可能是一个很好的 S/O 问题,可以单独询问以解释通过不同 impl 传递正则表达式的内部机制,例如(python/scala)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多