親クエリでは、spark-sqlサブクエリのフィールド名を解決できません

シナリオ:複数テーブルの結合またはユニオンを実行すると、次のエラーが発生します。

同じ名前の属性が操作に表示されます:complex_flag_code、quantity、pay_time_date、sales_price、oms_code、retail_price、promotion_sku_code。適切な属性が使用されているかどうかを確認してください。;;

実行する前にコードの各部分に個別にコメントすることにより、次のコードセグメントに問題を特定します。

...
...
(
    SELECT
      comp_sku.order_id 
      ,comp_sku.quantity 
      ,comp_sku.sales_price 
      ,comp_sku.promotion_sku_code
      ,sales_tmp.order_id 
    FROM
    (
        SELECT
          order_id
          ,promotion_sku_code
          ,quantity
          ,sales_price
        FROM all_detail
        WHERE is_gift = 1 AND promotion_sku_code IS NOT NULL 
    ) comp_sku
    
    LEFT JOIN
    (
        SELECT
          order_id
          ,sku_code
        FROM sales
    ) sales_tmp
    ON comp_sku.order_id = sales_tmp.order_id AND comp_sku.promotion_sku_code = sales_tmp.sku_code 
)
...
...

エラーレポートによると、推測:上記のコードはサブクエリとして使用され、結果が親クエリに提供されると、親クエリはサブクエリ結果のフィールドに解決されません。

ハイブの公式Webサイトで一度見たときに、結合または結合するときにフィールドエイリアスを指定する必要があると考えてください。そうしないと、データが失われます。

推測されたコードでこのようなcomp_sku.order_idなどのフィールドは、結果になcolumn1の、デフォルトのフィールド名になっていることなので、親クエリ内のORDER_IDが見つかりません。

したがって、コードを次のように変更します。

...
...
(
    SELECT
      comp_sku.order_id AS order_id
      ,comp_sku.quantity AS quantity
      ,comp_sku.sales_price AS sales_price
      ,comp_sku.promotion_sku_code AS promotion_sku_code
      ,sales_tmp.order_id AS s_order_id
    FROM
    (
        SELECT
          order_id
          ,promotion_sku_code
          ,quantity
          ,sales_price
        FROM all_detail
        WHERE is_gift = 1 AND promotion_sku_code IS NOT NULL 
    ) comp_sku
    
    LEFT JOIN
    (
        SELECT
          order_id
          ,sku_code
        FROM sales
    ) sales_tmp
    ON comp_sku.order_id = sales_tmp.order_id AND comp_sku.promotion_sku_code = sales_tmp.sku_code 
)
...
...

問題が解決しました。

総括する:

  1. 結合または結合するときは、フィールドエイリアスを定義する習慣を身に付けます。
  2. dfプログラミングを使用する場合、最初の要約にも同じことが当てはまります。

 

おすすめ

転載: blog.csdn.net/x950913/article/details/106810376