【问题标题】:pyspark equivalent of postgres regexp_substr fails to extract valuepyspark 等效于 postgres regexp_substr 无法提取值
【发布时间】:2021-04-29 20:54:43
【问题描述】:

我正在尝试将我拥有的一些 postgres sql 代码调整为 pyspark sql。在 postgres sql 中,我使用 regexp_substr 函数来解析 '.5G',如果它显示在 productname 列中的字符串中。 (我在下面包含了示例代码)。在 pyspark 方面,我正在尝试使用 regexp_extract 函数,但它只返回 null。我已经将 postgres 中 regexp_replace 函数的输出与 pyspark 进行了比较,它返回的值相同。所以问题必须在 regexp_extract 函数中。我已经创建了一个示例输入数据框以及我当前在下面运行的 pyspark 代码。谁能告诉我我做错了什么并建议如何解决它,谢谢。

postgres:

select
regexp_substr(trim(upper(regexp_replace(a.productname, '[,/#!$%^&*;:{}=_`~()-]'))), ' .5G') as A

from df

输出:

' .5G'

代码:

# creating dummy data

df = sc.parallelize([('LEMON MERINGUE .5G CAKE SUGAR', )]).toDF(["productname"])


# turning dataframe into view
df.createOrReplaceTempView("df")


# example query trying to extract ' .5G'
testquery=("""select
regexp_extract('('+trim(upper(regexp_replace(a.productname, '[,/#!$%^&*;:{}=_`~()-]','')))+')', ' .5G',1) as A
from df a
""")


# creating dataframe with extracted value in column
test_df=spark.sql(testquery)

test_df.show(truncate=False)

输出:

+----+
|A   |
+----+
|null|
+----+

【问题讨论】:

  • 只需检查字符串中是否存在.5G。这里不需要复杂的替换。
  • @TimBiegeleisen 如果我忽略“ trim(upper(regexp_replace(a.productname, '[,/#!$%^&*;:{}=_`~()-]', '')))",只需将其替换为 a.productname,它仍然返回 null。 regex_subtr 在我正在翻译的代码中被大量使用。在此示例中,.5G 之前还有一个“”,因此它试图匹配“.5G”。结果在 case 语句中使用。所以逻辑变得更加复杂。主要是我想弄清楚如何让 regexp_extract 像 regexp_subtr 一样工作。

标签: python-3.x postgresql pyspark apache-spark-sql


【解决方案1】:

您需要将'.5G' 括在括号中,而不是将列括在括号中。

testquery = """
select
    regexp_extract(trim(upper(regexp_replace(a.productname, '[,/#!$%^&*;:{}=_`~()-]',''))), '( .5G)', 1) as A
from df a
"""

test_df = spark.sql(testquery)
test_df.show(truncate=False)
+----+
|A   |
+----+
| .5G|
+----+

还请注意,您不能将+ 串在一起;为此目的使用concat

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 2018-04-10
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多