在 spark.sql 中的 select 中使用 cast()
Using cast() inside a select in spark.sql
我正在尝试做一件简单的事情:两个 table 之间的内部连接,但其中一个有一个重命名的列并且 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')
table DB2DFE.REN_AVLD_PF
有一个列 nr_cpf_base_srf
,我想将其更改为 nr_cpf
,以便我可以使用 sbx_d4n0cbf.pss_cpf_cli_msl
构建内部联接。但是nr_cpf_base_srf
的数据类型不太对:应该是decimal(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 设计委员会需要开始考虑他们自己的人体工程学)。
无论如何,将查询更改为 not 引用列表达式:
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_base_srf = 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_base_srf = b.NR_CPF
)
SELECT
t.*,
CAST( t.nr_cpf AS decimal (14,0) )
FROM
t
我正在尝试做一件简单的事情:两个 table 之间的内部连接,但其中一个有一个重命名的列并且 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')
table DB2DFE.REN_AVLD_PF
有一个列 nr_cpf_base_srf
,我想将其更改为 nr_cpf
,以便我可以使用 sbx_d4n0cbf.pss_cpf_cli_msl
构建内部联接。但是nr_cpf_base_srf
的数据类型不太对:应该是decimal(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 设计委员会需要开始考虑他们自己的人体工程学)。
无论如何,将查询更改为 not 引用列表达式:
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_base_srf = 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_base_srf = b.NR_CPF
)
SELECT
t.*,
CAST( t.nr_cpf AS decimal (14,0) )
FROM
t