Ссылка ‘column_name’ неоднозначна в SparkSQL

#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 .