2016-12-20 6 views
2

У меня есть две таблицы A и B. Оба имеют одинаковые имена столбцов. Я хочу объединить эти две таблицы и загрузить их в таблицу C. Таблица C также имеет те же имена столбцов, что и A и B, и еще один столбец в timestamp (это для захвата времени объединения). Я не хочу дубликатов в таблице C. Я пробовал объединение, но получал повторяющиеся значения, потому что один из столбцов в таблице C в типе данных Timestamp.Объединение двух таблиц с функцией unix_timestamp() в обоих

Для примера, ниже мой пример запроса

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 

Функция два UNIX_TIMESTAMP() возвращает различные временные метки (только милли второй разницы), и я получаю дубликаты данных из-за временной метки.

Есть ли другой способ получить одну и ту же метку времени для обеих функций при объединении?

+0

Вы можете вставить NULL в поле временной метки, а затем выполнить: обновление TableC установить field3 = UNIX_TIMESTAMP(), где field3 является нуль –

+0

@GiacomoDegliEsposti Спасибо за ваше предложение. Я сам нашел обходное решение. Я пробовал, как показано ниже, и это сработало. 'вставить таблицу перезаписи TableC выберите T1.field1, T1.field2, UNIX_TIMESTAMP(), как field3 из (выберите поле1, поле2 из TABLE_A UNION выберите field1, Field2 из TABLE_B) КАК T1' –

ответ

3

UNIX_TIMESTAMP()
Возвращает текущую метку времени Unix в секундах.
Эта функция недетерминирована и препятствует правильному оптимизации запросов -
это было устаревшим, начиная с 2,0 в пользу CURRENT_TIMESTAMP

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 

Дополнительные обходные

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 

или

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

почему мне нужно' группу by'? без 'group by' он работал нормально! –

+0

BTW. Это ужасно. Я не знал об этой проблеме, и я только что проверил ее на своей виртуальной машине. Спасибо, что вызвали :-) –

+1

P.s. Обратите внимание, что когда я использовал GROUP BY, я также использовал UNION ** ALL ** –