Я заметил, что некоторые даты содержат пробелы, некоторые без пробелов:
txn_date= 03-04-2015
и txn_date=03-04-2015
Попробуйте добавить trim
:
INSERT OVERWRITE TABLE dyn_part PARTITION(txn_date)
select id, user_id, amount, product, city, trim(txn_date) as txn_date
from product_order1;
Также лучше использовать формат даты, совместимый с Hive yyyy-MM-dd
, это можно сортировать.
Для одновременного форматирования даты и удаления пробелов вы можете использовать regexp_replace. Если ваш текущий формат MM-dd-yyyy
, то вы можете отформатировать его следующим образом:
select regexp_replace(' 03-04-2015','.*?(\\d{2})-(\\d{2})-(\\d{4})','$3-$1-$2') --fix accordingly if it is dd-MM-yyyy. In this case it should be '$3-$2-$1' in the replacement template.
Возвращает:
2015-03-04
Или загрузить так:
INSERT OVERWRITE TABLE dyn_part PARTITION(txn_date)
select id, user_id, amount, product, city,
regexp_replace(txn_date,'.*?(\\d{2})-(\\d{2})-(\\d{4})','$3-$1-$2') as txn_date
from product_order1;
regexp означает:
'.*?
- любой символ ноль или более раз
(\\d{2})
- первая группа из 2 цифр, которая будет указана при замене как $1
-
буквально тире
(\\d{2})
- вторая группа из 2 цифр, которая будет указана в замене как $2
-
тире буквально
(\\d{4})
- третья группа из 4 цифр, которая будет указана в замене как $3
И в качестве замены '$3-$1-$2'
мы берем группы из регулярных выражений в правильном порядке, разделенные тире. Предположим, что $ 3 - это год, $ 1 - месяц, $ 2 - день в ваших датах. Вы размещаете группы в правильном порядке, чтобы получить yyyy-MM-dd
, потому что невозможно понять, какой формат вы используете: MM-dd-yyyy
или dd-MM-yyyy