分区列等于Hive中的当前日期

时间:2017-04-03 17:16:34

标签: hadoop hive partition

我正在尝试使用分区将数据加载到Hive表中。

代码如下:

CREATE EXTERNAL TABLE URL(url STRING, clicks INT)
COMMENT 'Unique Clicks per URL'
PARTITIONED BY(dt STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/mypath/URL';

LOAD DATA INPATH '/inputpath/' INTO TABLE URL
PARTITION (dt=date_format(CURRENT_TIMESTAMP, "yyyy.MM.dd HH:mm:ss"));

我得到以下错误:

FAILED: ParseException line 4:14 cannot recognize input near 
'date_format' '(' 'CURRENT_TIMESTAMP' in constant

我尝试使用

SET hive.exec.dynamic.partition.mode=nonstrict;

但没有改变。

为什么不起作用? 如何将当前日期设置为分区列?

提前谢谢你。

洛伦佐

1 个答案:

答案 0 :(得分:0)

为什么在可以在其上创建外部表格时移动文件?
LOAD DATA INPATH只是将文件(HDFS元数据操作)“按原样”移动到表的位置。

为什么明确将分区列定义为字符串?

CREATE EXTERNAL TABLE URL ... PARTITIONED BY(dt DATE) ...

为什么要尝试使用非ISO格式(yyyy.MM.dd)?
ISO日期格式为yyyy-MM-dd

由于分区信息似乎不是数据的一部分,因此您有3个选项:

<强> 1
使用常量(不允许表达式,包括函数),例如

LOAD DATA INPATH '/inputpath/' INTO TABLE URL PARTITION (dt=date '2017-03-04');

<强> 2
创建一个额外的表URL_STG,类似于URL,但没有分区,并使用它来动态插入分区。

set hive.exec.dynamic.partition.mode=nonstrict;

insert into URL select *,current_date from URL_STG; 

第3

将日期作为CLI的变量提供

hive --hivevar dt=$(date +"%Y-%m-%d") -e \
'LOAD DATA INPATH '\''/inputpath/'\'' INTO TABLE URL PARTITION (dt=date '\''${hivevar:dt}'\'')'