我在HDFS日志文件,值由逗号分隔。 例如:
2012-10-11 12:00,opened_browser,userid111,deviceid222
现在,我希望加载这个文件来撵它具有列“时间戳”,“行动”和由“userid”,“设备ID”分区表。 我怎么能要求蜂巢采取日志文件中最后2列作为分区表? 所有的实施例eg "hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');"
需要在脚本分区的定义,但我想分区从HDFS文件自动设置。
一个解决方案是创建中间非分区表与所有的4列,从文件来填充它,然后使一个INSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid;
但毕竟是和额外的任务,我们将有2页非常相似的表...或者,我们应该创建外部表的中间。
张宁对在主题了很大的反响http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables 。
快速上下文是:
- 数据加载简单的拷贝数据,它不会读它,所以它不能找出分区什么
- 建议你将数据加载到一个中间表第一(或使用一个外部表指向所有文件),然后让分区动态插入踢将其加载到一个分区表
我从事这个非常相同的情况下,反而,我们所做的就是创建独立的HDFS数据文件,为每个需要加载分区。
由于我们的数据是从MapReduce工作即将到来,我们使用MultipleOutputs在我们的减速机类的数据多路复用到其相应的分区文件。 此后,它仅仅是一个建筑使用来自HDFS文件名分区脚本的问题。
正如@Denny李的答复中提到,我们需要涉及到一个临时表(invites_stg)管理的或外部的,然后从中间表分区表(在这种情况下邀请)插入。
确保我们有这两个属性设置为:
SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict;
最后插入到邀请,
INSERT OVERWRITE TABLE India PARTITION (STATE) SELECT COL's FROM invites_stg;
请参阅此链接帮助: http://www.edupristine.com/blog/hive-partitions-example
CREATE TABLE India (
OFFICE_NAME STRING,
OFFICE_STATUS STRING,
PINCODE INT,
TELEPHONE BIGINT,
TALUK STRING,
DISTRICT STRING,
POSTAL_DIVISION STRING,
POSTAL_REGION STRING,
POSTAL_CIRCLE STRING
)
PARTITIONED BY (STATE STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
5.指示蜂房动态加载分区
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
怎么样
LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');