我正试图适应一些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