#mysql #sql #scala #apache-spark
#mysql #sql #scala #apache-spark
Вопрос:
Я новичок как в Spark, так и в SQL. Я пытаюсь выполнить sql-запрос с использованием Spark Scala. Вот SQL-запрос:
SELECT
a.*
FROM
( SELECT
a1.id_bu,
a1.nama,
a1.id_Bentuk_bu,
a1.id_bentuk_usaha,
a1.id_Jenis_bu,
a1.id_Jenis_bu_kbli,
a1.alamat,
a1.kodepos,
a1.telepon,
a1.fax,
a1.email,
a1.website,
a1.id_kabupaten,
a1.id_propinsi,
a1.npwp,
a1.no_spt as modal_dasar,
a1.log,
a2.bu_nomor
FROM
bu a1,
bu_nomor a2
where
a1.id_bu = a2.id_bu
AND a1.id_propinsi = a2.id_propinsi
) as a,
( SELECT
b.id_bu,
b.id_sub_klasifikasi_kbli,
b.kualifikasi_kbli,
b.id_asosiasi_bu,
b.propinsi,
b.tgl_permohonan,
c.tgl_habis
FROM
( SELECT
b1.id_bu,
b1.id_sub_klasifikasi_kbli,
b1.kualifikasi_kbli,
b1.id_asosiasi_bu,
b1.propinsi,
b1.tgl_permohonan
FROM
bu_registrasi_history_kbli b1
WHERE
b1.id_status = '4'
AND b1.tgl_proses < '2018-03-01' ) as b,
( SELECT
c1.id_bu,
c1.id_klasifikasi,
c1.id_asosiasi_bu,
c1.tgl_habis
FROM
bu_sbu_kbli c1
WHERE
c1.tgl_habis >= '2018-03-01' ) as c
WHERE
b.id_bu = c.id_bu
AND SUBSTR( b.id_sub_klasifikasi_kbli, 1, 3) = c.id_klasifikasi
AND b.id_asosiasi_bu = c.id_asosiasi_bu
UNION all
SELECT
d.id_bu,
d.id_sub_klasifikasi_kbli,
d.kualifikasi_kbli,
d.id_asosiasi_bu,
d.propinsi,
d.tgl_permohonan,
e.tgl_habis
FROM
( SELECT
d1.id_bu,
d1.id_sub_klasifikasi_kbli,
d1.kualifikasi_kbli,
d1.id_asosiasi_bu,
d1.propinsi,
d1.tgl_permohonan
FROM
bu_registrasi_history_kbli_hapus d1
WHERE
d1.id_status='4'
AND d1.tgl_proses<'2018-03-01' ) as d,
( SELECT
e1.id_bu,
e1.id_klasifikasi,
e1.id_asosiasi_bu,
e1.tgl_habis
FROM
bu_sbu_kbli_hapus e1
WHERE
e1.tgl_habis >= '2018-03-01' ) as e
WHERE
d.id_bu = e.id_bu
AND SUBSTR( d.id_sub_klasifikasi_kbli, 1, 3) = e.id_klasifikasi
AND d.id_asosiasi_bu = e.id_asosiasi_bu
GROUP BY
id_bu,
id_sub_klasifikasi_kbli
ORDER BY
tgl_habis,
tgl_permohonan DESC) x1
WHERE
a.id_bu = x1.id_bu
GROUP BY
x1.id_bu
Я получаю следующую ошибку:
org.apache.spark.sql.AnalysisException: Reference 'id_bu' is ambiguous, could be: d.id_bu, e.id_bu.; line 81 pos 12
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolve(LogicalPlan.scala:213)
Я не уверен, в чем ошибка? Речь идет о двух столбцах с одинаковым именем? Если я попытаюсь использовать d.id_bu и d.id_sub_klasifikasi_kbli, как указано в ошибке в этой предпоследней GroupBy, он говорит:
'd.`kualifikasi_kbli`' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get.;;
Aggregate [id_bu#21], [id_bu#1, nama#2, id_Bentuk_bu#3, id_bentuk_usaha#4, id_Jenis_bu#5, id_Jenis_bu_kbli#6, alamat#7, kodepos#8, telepon#9, fax#10, email#11, website#12, id_kabupaten#13, id_propinsi#14, npwp#15, modal_dasar#0, log#17, bu_nomor#19]
Есть идеи, как я могу это решить? Спасибо!
Комментарии:
1. Обе ошибки очень понятны, и вам не следует использовать group by без агрегатных функций, я предлагаю вам вместо этого попробовать DISTINCT.
Ответ №1:
Вы должны указать таблицу в своем предложении group by
Ответ №2:
После просмотра вашего запроса и переформатирования для лучшей читаемости и знания того, что было во всех подзапросах и объединениях select, я обнаружил, что ошибка относится к (как указано) ПРЕДЛОЖЕНИЮ GROUP BY, в котором вы объединяете свои таблицы «d» и «e». Поскольку оба имеют id_bu, вам просто нужно квалифицироваться как либо
d.id_bu
или
e.id_bu
Но поскольку это часть ОБЪЕДИНЕНИЯ SELECT ALL, это также может быть ваш псевдоним «b» или «c».
Далее идет неагрегатная ошибка. Чтобы использовать group by, вы должны указать столбцы, которые вы хотите сгруппировать. В этом случае вы группируете по двум столбцам, но возвращаете
d.id_bu,
d.id_sub_klasifikasi_kbli,
d.kualifikasi_kbli,
d.id_asosiasi_bu,
d.propinsi,
d.tgl_permohonan,
e.tgl_habis
Итак, вам нужно определить, как применить минимальный, максимальный, средний или другой агрегат к столбцам, НЕ входящим в группу. Если оставшиеся 5 могут измениться, делаете ли вы их каждый раз MIN () или MAX () просто так, чтобы они возвращались, или вы добавляете их все в свою группу by.
Ответ №3:
На самом деле это базовая ошибка SQL, в этом предложении нет ничего специфичного для Scala или Spark
GROUP BY
id_bu
Здесь вы должны указать псевдоним подзапроса, по которому вы хотите сгруппировать: group by d.id_bu
или group by e.id_bu
.