Невозможно создать уникальный раздел Hive - PullRequest
1 голос
/ 06 октября 2019

Я не могу создать уникальные разделы. когда я загружаю данные, он снова и снова создает все даты как раздел, даже даты совпадают

create table product_order1(id int,user_id int,amount int,product string, city string, txn_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';

ОК Время: 0,133 секунды

    LOAD DATA LOCAL INPATH 'txn' INTO TABLE product_order1;
    Loading data to table oct19.product_order1
    Table oct19.product_order1 stats: [numFiles=1, totalSize=303]
OK

Время: 0,426секунд

    hive> 
    > set hive.exec.dynamic.partition = true;
    hive> 
    > set hive.exec.dynamic.partition.mode = true;

    hive> 
    > create table dyn_part(id int,user_id int,amount int,product string,city string) PARTITIONED BY(txn_date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
OK

Время: 0,14 секунды

    hive >
INSERT OVERWRITE TABLE dyn_part PARTITION(txn_date) select id,user_id,amount,product,city,txn_date from product_order1;

Результат, который я получил: -

    Loading data to table oct19.dyn_part partition (txn_date=null)
     Time taken for load dynamic partitions : 944
    Loading partition {txn_date=04-02-2015}
    Loading partition {txn_date= 03-04-2015}
    Loading partition {txn_date=01-02-2015}
    Loading partition {txn_date=03-04-2015}
    Loading partition {txn_date= 01-01-2015}
    Loading partition {txn_date=01-01-2015}
    Loading partition {txn_date= 01-02-2015}
     Time taken for adding to write entity : 5
Partition oct19.dyn_part{txn_date= 01-01-2015} stats: [numFiles=1, numRows=1, totalSize=25, rawDataSize=24]
Partition oct19.dyn_part{txn_date= 01-02-2015} stats: [numFiles=1, numRows=1, totalSize=25, rawDataSize=24]
Partition oct19.dyn_part{txn_date= 03-04-2015} stats: [numFiles=1, numRows=2, totalSize=50, rawDataSize=48]
Partition oct19.dyn_part{txn_date=01-01-2015} stats: [numFiles=1, numRows=1, totalSize=26, rawDataSize=25]
Partition oct19.dyn_part{txn_date=01-02-2015} stats: [numFiles=1, numRows=1, totalSize=26, rawDataSize=25]
Partition oct19.dyn_part{txn_date=03-04-2015} stats: [numFiles=1, numRows=1, totalSize=26, rawDataSize=25]
Partition oct19.dyn_part{txn_date=04-02-2015} stats: [numFiles=1, numRows=1, totalSize=25, rawDataSize=24]
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1   Cumulative CPU: 4.03 sec   HDFS Read: 4166 HDFS Write: 614 SUCCESS
Total MapReduce CPU Time Spent: 4 seconds 30 msec

1 Ответ

1 голос
/ 06 октября 2019

Я заметил, что некоторые даты содержат пробелы, некоторые без пробелов:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...