[英]Using cast() inside a select in spark.sql
我正在嘗試做一件簡單的事情:兩個表之間的內部連接,但其中一個表的列已重命名,並且 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;
這一定是一件非常簡單的事情,但我不知道該怎么做,也找不到任何答案。 所以:怎么了? 請。
ISO SQL(Apache Spark主要實現)不允許您從同一SELECT
投影子句引用其他列或表達式。
所以你不能這樣做:
SELECT
( a + 123 ) AS b,
( b + 456 ) AS c
FROM
someTable
(可以說,ISO SQL應該允許這樣做,否則您需要一個 CTE 或外部查詢,這將擴大查詢的文本大小:ISO SQL 設計委員會需要開始考慮他們自己的人體工程學)。
無論如何,將您的查詢更改為不引用列表達式:
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_base_srf 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
如果您確實想在CAST
之前為該列加上別名,那么您將需要一個外部查詢:
SELECT
t.*,
CAST( t.nr_cpf AS decimal (14,0) )
FROM
(
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
FROM
DB2DFE.REN_AVLD_PF as A
INNER JOIN sbx_d4n0cbf.pss_cpf_cli_msl AS B ON a.nr_cpf = b.NR_CPF
) AS t
或 CTE:
WITH t AS (
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
FROM
DB2DFE.REN_AVLD_PF as A
INNER JOIN sbx_d4n0cbf.pss_cpf_cli_msl AS B ON a.nr_cpf = b.NR_CPF
)
SELECT
t.*,
CAST( t.nr_cpf AS decimal (14,0) )
FROM
t
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.