我正在尝试使用分区将数据加载到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 :(得分: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}'\'')'