我无法创建唯一的分区。当我上传数据时,它一次又一次地将所有日期创建为分区,即使日期相同

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

最佳答案

我注意到有些日期包含空格,有些则没有空格:
txn_date= 03-04-2015txn_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',我们以适当的顺序从regexp中获取组,并用破折号分隔。假设$ 3是年份,$ 1是月,$ 2是日期。您以正确的顺序放置组以获得yyyy-MM-dd,因为无法了解您使用的是哪种格式:MM-dd-yyyydd-MM-yyyy

关于date - 无法创建Hive唯一分区,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58255001/

10-16 01:54