我有下面的 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;
任何人都可以帮我知道如何检查每个数组值的正则表达式吗?
错误消息表明 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(