Pyspark 在数组元素上应用正则表达式模式

问题描述 投票:0回答:1

我有下面的 Pyspark 代码来验证嵌套 json 中的字段 -

"CASE WHEN array_contains(transform(RECORDS_003.DATA.TOTAL_CHARGE, x -> trim(x)), '') OR exists(RECORDS_003.DATA.TOTAL_CHARGE, x -> x IS NULL) THEN 'TOTAL_CHARGE is missing' ELSE NULL END",

DATA 中是 json 数组,其中每个 json 都有 TOTAL_CHARGE 字段。 上述验证工作正常并给出了我预期的结果。 但现在我想检查每个数组元素的正则表达式(金额正则表达式)模式,如果任何值与正则表达式不匹配,则返回 False。

尝试使用以下代码 -

"CASE WHEN array_contains(RECORDS_003.DATA.TOTAL_CHARGE, regexp_extract(RECORDS_003.DATA.TOTAL_CHARGE, r'^[-+]?[0-9]*\.?[0-9]+$', 0)) THEN 'TOTAL_CHARGE is invalid' ELSE NULL END"

但它给出以下错误-

AnalysisException: cannot resolve 'regexp_extract(df_view.RECORDS_003.`DATA`.`TOTAL_CHARGE`, '^[-+]?[0-9]*\\.?[0-9]+$', 0)' due to data type mismatch: argument 1 requires string type, however, 'df_view.RECORDS_003.`DATA`.`TOTAL_CHARGE`' is of array<string> type.; line 1 pos 56;

任何人都可以帮我知道如何检查每个数组值的正则表达式吗?

apache-spark pyspark apache-spark-sql
1个回答
0
投票

错误消息表明 PySpark 正在尝试将正则表达式应用于字符串数组(数组)而不是单个字符串。

假设您的 json 有一个 TOTAL_CHARGE 列,其中包含 ["10.00", "20.50"] 等字符串数组

所以如果需要单独处理数组的每个元素,请使用explode函数。

exploded_df = df.withColumn("exploded_charge",exploded(col("RECORDS_003.DATA.TOTAL_CHARGE")))

processed_df =exploded_df.withColumn("processed_charge", col("exploded_charge").regexp_extract())

© www.soinside.com 2019 - 2024. All rights reserved.