我在HDFS中有一个日志文件,值以逗号分隔。例如:
2012-10-11 12:00,opened_browser,userid111,deviceid222
现在我想将此文件加载到Hive表,该表包含“timestamp”,“action”列,并由“userid”,“deviceid”分区。我如何让Hive将日志文件中的最后2列作为表的分区?所有示例e.g. "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个非常类似的表..或者我们应该创建外部表作为中间。
答案 0 :(得分:16)
张宁在http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables对这个话题有很好的回应。
快速背景是:
答案 1 :(得分:3)
我使用了相同的方案,但我们所做的是为您需要加载的每个分区创建单独的HDFS数据文件。
由于我们的数据来自MapReduce作业,因此我们在Reducer类中使用MultipleOutputs将数据多路复用到相应的分区文件中。之后,只需使用HDFS文件名中的分区构建脚本即可。
答案 2 :(得分:3)
正如@Denny Lee的回答所述,我们需要涉及一个临时表(invites_stg) 托管或外部,然后从登台表INSERT到分区表(在这种情况下邀请)。
确保我们将这两个属性设置为:
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
答案 3 :(得分:-1)
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;
答案 4 :(得分:-2)
怎么样
LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');