【问题标题】:Partition column equal to current date in Hive分区列等于 Hive 中的当前日期
【发布时间】:2017-08-28 16:08:08
【问题描述】:

我正在尝试使用分区将数据加载到 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;

但没有任何改变。

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

提前谢谢你。

洛伦佐

【问题讨论】:

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

标签: hadoop hive partition


【解决方案1】:

既然可以在文件之上创建外部表,为什么还要移动文件?
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}'\'')'

【讨论】:

  • 感谢您的回复。很抱歉这令人沮丧,我刚开始使用 Hive,但是,我不确定我是否理解它为什么如此令人沮丧。关于您的问题:1)我需要移动数据,因为这是更大脚本的一部分,并且需要为下一次“迭代”清除包含数据的文件夹。 2) 在尝试使用日期格式、unixtimestamp 等数小时后,“字符串”最终出现在此处,对此感到抱歉。 3) 没有特别的原因,只是不知道复制/过去,感谢 ISO 上的信息。是否可以从函数定义常量?谢谢
  • 分区列的类型为字符串。分区列的名称是dt,假设代表“日期”。实际值是时间戳(直到秒级别)。格式不是 ISO。在错误中使用除常量之外的任何内容进行分区声明。动态分区与load data inpath 无关。你从哪里开始处理这个职位? :-) ...不,除了文字你不能使用任何东西
猜你喜欢
  • 2015-04-29
  • 2015-10-07
  • 1970-01-01
  • 2016-07-08
  • 2016-08-12
  • 2023-03-23
  • 2021-01-27
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多