Почему я не получаю все колонки от этого Союза?

#sql #pyspark #apache-spark-sql

Вопрос:

Я пытаюсь объединить две разные записные книжки в одну, адаптируя логику построения двух разных таблиц.

Первая гласит::

 spark.sql(''' SELECT CD_CLI,   MAX(VL_RPTD_UTZO) AS MAX_VL_RPTD_UTZO,  '2017-01-31' AS DT_MVTC  FROM vl_rptd_utzo  WHERE DT_EXTC BETWEEN '2016-07-31' AND '2016-12-31'  GROUP BY CD_CLI   ''').createOrReplaceTempView('vl_rptd_max_utzo_2017_01_31')  

И второй:

 spark.sql('''SELECT CD_CLI,  CASE WHEN SUM(in_lim_crt) gt; 0   THEN ROUND(SUM(SUM_VL_TTL_FAT)/SUM(in_lim_crt), 4)  ELSE -99999999999  END AS VL_MED_FAT,  '2017-01-31' as DT_MVTC  FROM in_lim_fat  WHERE DT_MVTC BETWEEN '2016-07-31' AND '2016-12-31'  GROUP BY CD_CLI  ''').createOrReplaceTempView('media_vl_fatura_2017_01_31')  

Мой, возможно, наивный?, подход состоял в объединении двух вариантов, так как они вызывают одни и те же поля из одного и того же источника:

 spark.sql('''SELECT CD_CLI,  CASE WHEN SUM(in_lim_crt) gt; 0   THEN ROUND(SUM(SUM_VL_TTL_FAT)/SUM(in_lim_crt), 4)  ELSE -99999999999  END AS VL_MED_FAT,  '2017-01-31' as DT_MVTC  FROM in_lim_fat  WHERE DT_MVTC BETWEEN '2016-07-31' AND '2016-12-31'  GROUP BY CD_CLI  UNION  SELECT CD_CLI,  MAX(VL_RPTD_UTZO) AS MAX_VL_RPTD_UTZO,  '2017-01-31' AS DT_MVTC  FROM vl_rptd_utzo  WHERE DT_EXTC BETWEEN '2016-07-31' AND '2016-12-31'  GROUP BY CD_CLI  ''').createOrReplaceTempView('new_table')  

Но когда я прошу описать:

 spark.sql('describe new_table').show(10, False)  

На выходе получается:

  ---------- ------------- -------  |col_name |data_type |comment|  ---------- ------------- -------  |CD_CLI |int |null | |VL_MED_FAT|decimal(38,4)|null | |DT_MVTC |string |null |  ---------- ------------- -------   

Почему MAX_VL_RPTD_UTZO не отображается в новой таблице? Я новичок в sql, и, возможно, это очень наивно и просто, но я не могу решить эту проблему.

Комментарии:

1. Вы ВЫБИРАЕТЕ 3 столбца и получаете 3 столбца. Как и ожидалось. (Имена столбцов взяты из первого ВЫБОРА.)

2. Сделайте select c1, c2, c3, null и т. Д., чтобы получить 4 столбца. А может быть, вы хотите ВСЕГО ЭТОГО?

Ответ №1:

У вашего первого выбора есть CD_CLI , VL_MED_FAT и DT_MVTC

У вашего второго выбора есть CD_CLI , MAX_VL_RPTD_UTZO и DT_MVTC

Spark будет использовать имя столбца первого запроса в качестве схемы и применять его к другим запросам подпоследовательности в объединении, поэтому значения MAX_VL_RPTD_UTZO будут отображаться в VL_MED_FAT .

Правка №1: Если вы хотите иметь 4 столбца, то это должно быть соответствие между 2 запросами, так что что-то вроде этого

 select CD_CLI, VL_MED_FAT, null as MAX_VL_RPTD_UTZO, DT_MVTC from ... union select CD_CLI, null as VL_MED_FAT, MAX_VL_RPTD_UTZO, DT_MVTC from ...  

Комментарии:

1. Я понимаю. Могу ли я иметь значения MAX_VL_RPTD_UTZO не в VL_MED_FAT, а независимо? Я имею в виду, могу ли я иметь 4 столбца, используя другой метод запроса, отличный от UNION?

2. Да, конечно, проверьте мой обновленный ответ

3. хорошо!!! Спасибо! Я не знал, что могу использовать эти «нуль КАК…» для построения таблицы. Так что все было очень просто, как я и думал. Большое спасибо.

4. ну, вы использовали '2017-01-31' as DT_MVTC для построения таблицы, так что, по сути, это одно и то же 🙂