簡體   English   中英

在 spark.sql 的 select 中使用 cast()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM