【发布时间】: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