Spark SQL的SELECT语句中使用cast()转换字段后关联表报错如何解决
问题根因
- SQL执行顺序限制:JOIN关联逻辑的执行优先级高于SELECT字段别名定义,你在SELECT中给
nr_cpf_base_srf设置的别名nr_cpf,在执行ON关联条件时还未生效,A表的可用字段只有原生字段nr_cpf_base_srf,因此触发找不到a.nr_cpf的报错。 - 类型转换逻辑位置错误:你当前把cast转换放在SELECT层,关联时还是使用原字段类型,既可能出现类型不匹配的关联问题,还会导致SELECT返回两个同名的
nr_cpf字段,引发新的冲突。
修正方案
提供两种常用实现方式:
方式1:关联时直接转换原字段,适合逻辑简单的场景
spark.sql(f'''SELECT cast(A.nr_cpf_base_srf AS decimal (14,0)) as nr_cpf, cd_fon_ren, dt_ref_ren, vl_ren, dt_incl_ren_avld, dt_bxa_ren, cd_usu_rsp_atl FROM DB2DFE.REN_AVLD_PF as A INNER JOIN sbx_d4n0cbf.pss_cpf_cli_msl as B ON cast(A.nr_cpf_base_srf AS decimal (14,0)) = b.NR_CPF ''').createOrReplaceTempView('temp_x')
方式2:先用CTE预处理A表字段再关联,可读性更高,避免重复写转换逻辑
spark.sql(f'''WITH A_preprocessed AS ( SELECT cast(nr_cpf_base_srf AS decimal (14,0)) as nr_cpf, cd_fon_ren, dt_ref_ren, vl_ren, dt_incl_ren_avld, dt_bxa_ren, cd_usu_rsp_atl FROM DB2DFE.REN_AVLD_PF ) SELECT * FROM A_preprocessed as A INNER JOIN sbx_d4n0cbf.pss_cpf_cli_msl as B ON A.nr_cpf = B.NR_CPF ''').createOrReplaceTempView('temp_x')
补充说明:如果B表的NR_CPF字段类型也不是decimal(14,0),建议同步转换后再关联,避免隐式转换导致关联结果异常。
内容的提问来源于stack exchange,提问作者Silvio sjsj
相关产品推荐
相关产品推荐

