pyspark对应的postgres regexp_substr提取值失败



我正试图适应一些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'用圆括号括起来,而不是将列用圆括号括起来。

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

最新更新