2016-12-20 2 views
2

Ich habe zwei Tabellen A und B. Beide hat die gleichen Spaltennamen. Ich möchte diese zwei Tabellen zusammenführen und sie in Tabelle C laden. Tabelle C hat auch die gleichen Spaltennamen wie A und B und eine weitere Spalte im Zeitstempel (dies für die Erfassung der zusammengeführten Zeit). Ich möchte keine Duplikate in Tabelle C. Ich versuchte Union, aber doppelte Werte erhalten, weil eine der Spalte in Tabelle C im Timestamp-Datentyp.Union zwei Tabellen mit Unix_timestamp() -Funktion in beiden

Zum Beispiel unten ist meine Beispielabfrage

insert overwrite table TableC 
select field1,field2, unix_timestamp() as field3 from table_A 
UNION 
select field1,field2, unix_timestamp() as field3 from table_B 

Die beiden unix_timestamp() Funktion unterschiedliche Zeitstempel (nur eine Millisekunde Differenz) gibt, und ich bin immer doppelte Daten wegen des Zeitstempels.

Gibt es eine andere Möglichkeit, den gleichen Zeitstempel für beide Funktionen während der Vereinigung zu erhalten?

+0

Sie können NULL in dem Zeitstempel-Feld einfügen und dann ausführen: update TableC gesetzt field3 = unix_timestamp(), wo field3 null –

+0

@GiacomoDegliEsposti Vielen Dank für Ihre Anregung ist. Ich selbst habe die Problemumgehung gefunden. Ich habe versucht wie unten und es hat funktioniert. 'einfügen Überschreiben Tabelle TableC wählen T1.field1, T1.field2, unix_timestamp() als field3 von (wählen Sie Feld1, Feld2 aus TABLE_A UNION select Feld1, Feld2 aus Table_B) AS T1' –

Antwort

3

unix_timestamp()
Ruft aktuellen Unix-Zeitstempel in Sekunden.
Diese Funktion ist nicht-deterministisch und verhindert die ordnungsgemäße Optimierung von Abfragen -
dies seit 2.0 für CURRENT_TIMESTAMP veraltet ist

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

insert overwrite table TableC 
select field1,field2, unix_timestamp(current_timestamp) as field3 from table_A 
UNION 
select field1,field2, unix_timestamp(current_timestamp) as field3 from table_B 

Zusätzliche Umgehungen

insert overwrite table TableC 

select  field1,field2,unix_timestamp() as field3 

from  (  select field1,field2 from table_A 
      union all select field1,field2 from table_B 
      ) t 

group by field1,field2 

oder

insert overwrite table TableC 

select  field1,field2,unix_timestamp() as field3 

from  ( select field1,field2 from table_A 
      union select field1,field2 from table_B 
      ) t 
+0

, warum ich' Gruppe brauchen vorbei? ohne "Gruppe von" es hat gut funktioniert! –

+0

BTW. Das ist fürchterlich. Ich war mir dieses Problems nicht bewusst und habe es gerade auf meiner VM überprüft. Danke, dass du es angesprochen hast :-) –

+1

P.s. Beachten Sie, dass bei Verwendung von GROUP BY auch UNION ** ALL verwendet wurde. –

Verwandte Themen