#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
для построения таблицы, так что, по сути, это одно и то же 🙂