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

Partition column equal to current date in Hive

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

代码如下:

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;

但没有任何改变。

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

提前谢谢你。

洛伦佐

当您可以在文件之上创建外部 table 时,为什么要移动这些文件?
LOAD DATA INPATH 只是将文件(HDFS 元数据操作)"as is" 移动到 table 的位置。

分区列明明是日期,为什么要定义成字符串?

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.
创建一个额外的 table、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}'\'')'