2017-04-03 39 views
0

我试图使用分区将数据加载到Hive表中。分区列与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; 

,但什么都没有改变。

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

预先感谢您。

洛伦佐

+0

这是非常令人沮丧的回答你的问题。我强烈建议您在继续使用Hive之前阅读一些文档/教程。 –

回答

0

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

为什么在明确约会时将分区列定义为字符串?

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

为什么你想使用非ISO格式(YYYY.MM.DD)?
ISO日期格式为YYYY-MM-DD


因为它似乎分区信息不是数据的一部分,你有3种选择:


使用常数(不允许表达,包括函数),例如

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; 

供应的日期作为变量从CLI

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

感谢您的回复。我很抱歉,这很令人沮丧,我刚开始使用Hive,但是,我不确定我是否明白为什么它非常令人沮丧。关于你的问题: 1)我需要移动数据,因为这是一个更大的脚本的一部分,并且包含数据的文件夹需要为下一次“迭代”清除。 2)在使用dateformats,unixtimestamp等不成功的尝试几个小时后,“串”结束了,对此抱歉。 3)没有特别的原因,只是不知道复制/过去,感谢有关ISO的信息。 是否可以从函数定义常量? 谢谢 – lorenzotenti

+0

分区列的类型是字符串。分区列的名称是'dt',它代表“日期”。实际值是一个时间戳(直到秒级)。格式不是ISO。在错误中使用除常量以外的任何分区声明。动态分区与'load inpath'无关。你在哪里开始处理这个职位? :-) ...和不,你不能使用任何东西,但文字 –