繁体   English   中英

Hive在分区表中加载

[英]Hive loading in partitioned table

我在HDFS中有一个日志文件,值由逗号分隔。 例如:

2012-10-11 12:00,opened_browser,userid111,deviceid222

现在我想将此文件加载到Hive表,该表具有“timestamp”,“action”列,并由“userid”,“deviceid”分区。 我如何让Hive将日志文件中的最后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上对此主题做出了很好的回应。

快速的背景是:

  1. 加载数据只是复制数据,它不会读取它,因此无法弄清楚要分区的内容
  2. 建议您首先将数据加载到中间表(或使用指向所有文件的外部表),然后让分区动态插入启动以将其加载到分区表中

我的工作方式非常相似,但我们所做的是为您需要加载的每个分区创建单独的HDFS数据文件。

由于我们的数据来自MapReduce作业,因此我们在Reducer类中使用MultipleOutputs将数据多路复用到相应的分区文件中。 之后,只需使用HDFS文件名中的分区构建脚本即可。

  1. 正如在@Denny Lee的回答中提到的,我们需要涉及一个托管表(invites_stg)托管或外部,然后从登台表INSERT到分区表(在这种情况下邀请)。

  2. 确保我们将这两个属性设置为:

     SET hive.exec.dynamic.partition=true; SET hive.exec.dynamic.partition.mode=nonstrict; 
  3. 最后插入邀请,

     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');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM