2017-04-23 1 views
0

Ich habe versucht, doppelte Datensatzanzahl aus der Tabelle zu erhalten, aber für bestimmte Partitionen Daten sind nicht verfügbar, so dass Stock nur "OK" Ergebnis drucken. Ist es möglich, dieses Ergebnis mit einem Wert wie 0 oder NULL zu ändern. Ja habe versucht mit nvl, COALESCE, Fall Option immer noch zeigt es OK. UND Ziel ist es, nur doppelte Zählung prüfen, erforderlich, um mindestens einen WertÄndern Standard-Hive-Ergebnis auf einige Werte

select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME 
from xyz 
where data_dt='20170423' 
group by col1,col2 
having count(*) >1 
+0

Das macht keinen Sinn. Fügen Sie Ihrem Beitrag ein Datenbeispiel hinzu, einschließlich der erforderlichen Ergebnisse. Ps.s. Auf jeden Fall arbeiten mit Datum oder mindestens mit ISO-Format YYYY-MM-DD –

+0

@Dudu Markovitz Es gibt keine Daten: '... aber für bestimmte Partitionen Daten sind nicht verfügbar' – leftjoin

Antwort

0

Es wird keine Zeilen auf leeren Datensatz zurück, weil Sie group by und having Filter verwenden. Gruppieren, indem Sie nichts gruppieren, deshalb gibt es keine Zeilen zurück. Ohne Gruppe von und mit Abfrage gibt 0:

select nvl(count(*),0) cnt, 'xyz' AS TABLE_NAME 
from xyz 
where data_dt='20170423' 

Als Lösung können Sie UNION ALL mit null Zeile, wenn sie leer Dataset

select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME 
from xyz 
where data_dt='20170423' 
group by col1,col2 
having count(*) >1 

UNION ALL --returns 1 row on empty dataset 

select col1, col2, DUPLICATE_ROW_COUNT, TABLE_NAME 
    from (select null col1, null col2, null AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME 
     )a --inner join will not return rows when non-empty dataset 
     inner join (
select count(*) cnt from --should will return 0 on empty dataset 
(--your original query 
select col1, col2, nvl(count(*),0) AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME 
from xyz 
where data_dt='20170423' 
group by col1,col2 
having count(*) >1 
)s --your original query 
)s on s.cnt=0 

Auch wird es möglich sein CTE zu verwenden (WITH) und WHERE NOT EXISTS statt von inner join für Ihre Unterabfrage, hat es nicht getestet.

Sie können auch Shell verwenden Ergebnis zu erhalten und es auf leeren Wert testen:

dataset=$(hive -e "set hive.cli.print.header=false; [YOUR QUERY HERE]); 
# test on empty dataset 

if [[ -z "$dataset" ]] ; then 
    dataset=0 
fi 
+0

Abfrage scheint korrekt, aber Hive unterstützt nicht dual, FEHLER: SemanticException [Fehler 10001]: Zeile 2: 5 Tabelle nicht gefunden 'Dual' Shell-Abfrageausführung ist korrekt, aber erforderliches Ergebnis in Hive-Shell nur – user2928137

+0

Dann erstellen Sie Dual mit Einzelzeile. Oder alternativ select ohne Tabelle, Sie können es tun, weil es keine Notwendigkeit in der Tabelle gibt: 'select col1, col2, DUPLICATE_ROW_COUNT, TABLE_NAME von (wählen Sie null col1, null col2, null AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME) a' stattdessen von 'select null col1, null col2, null AS DUPLICATE_ROW_COUNT, 'xyz' AS TABLE_NAME von default.dual' – leftjoin

+0

Ja, Sie haben Recht, es gibt standardmäßig kein duales: https://issues.apache.org/jira/ browse/HIVE-1558 – leftjoin

Verwandte Themen