【发布时间】:2021-11-24 20:17:34
【问题描述】:
我正在尝试做一件简单的事情:两个表之间的内部连接,但其中一个表的列已重命名,并且 data_type 错误。所以我想使用 cast() 并更改列的名称。 我这样做了:
spark.sql(f'''SELECT nr_cpf_base_srf as nr_cpf,
cd_fon_ren,
dt_ref_ren,
vl_ren,
dt_incl_ren_avld,
dt_bxa_ren,
cd_usu_rsp_atl,
cast(nr_cpf AS decimal (14,0))
FROM DB2DFE.REN_AVLD_PF as A
INNER JOIN sbx_d4n0cbf.pss_cpf_cli_msl as B
ON a.nr_cpf = b.NR_CPF
''').createOrReplaceTempView('temp_x')
表DB2DFE.REN_AVLD_PF 有一个列nr_cpf_base_srf,我想将其更改为nr_cpf,这样我就可以使用sbx_d4n0cbf.pss_cpf_cli_msl 构建内部连接。但是nr_cpf_base_srf 的数据类型是正确的:它应该是十进制(14,0),因此我使用了cast()。它引发了错误:
SparkStatementException: "cannot resolve '`a.nr_cpf`' given input columns: [B.dt_mvtc, A.dt_bxa_ren, B.NR_CPF,
B.cd_cli, A.dt_incl_ren_avld, A.cd_fon_ren, A.vl_ren, A.cd_usu_rsp_atl, A.dt_ref_ren, A.nr_cpf_base_srf];
line 11 pos 17;
这一定是一件非常简单的事情,但我不知道该怎么做,也找不到任何答案。所以:怎么了?请。
【问题讨论】:
-
您说该列是
nr_cpf_base_srf,但您的SQL 使用nr_cpf- 它们是不同的名称。 -
是的,但我选择了“nr_cpf_base_srf”作为“nr_cpf”。不对吗?第一行,我想,这样做,不是吗?
-
您不能在同一
SELECT投影子句中引用其他列。只有 MySQL 允许您这样做,但它违反了 ISO SQL。 Apache Spark 不允许。 -
然后我用我想要的新类型投射它。但我不确定如何将
nr_cpf_base_srf选择为 nr_cpf -
好的,我明白了。因此我需要在另一个子句上更改选择之前的列名?我的意思是,我调用一个 select 来更改名称,然后调用一个新的 select 来执行我想要的查询?
标签: sql pyspark apache-spark-sql