17

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

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

现在我想将此文件加载到具有列“timestamp”、“action”并按“userid”、“deviceid”分区的 Hive 表中。如何要求 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 个非常相似的表。或者我们应该创建外部表作为中间表。

4

5 回答 5

17

Ning Zhang 在http://grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tables对此话题有很好的回应。

快速的上下文是:

  1. 加载数据只是复制数据,它不读取数据,因此无法确定要分区的内容
  2. 建议您首先将数据加载到中间表中(或使用指向所有文件的外部表),然后让分区动态插入启动以将其加载到分区表中
于 2012-11-05T00:45:56.070 回答
6
  1. 正如@Denny Lee 的回答中提到的,我们需要涉及一个托管或外部的临时表(invites_stg),然后从临时表插入到分区表(在这种情况下为邀请)。

  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.eduristine.com/blog/hive-partitions-example

于 2017-04-23T13:48:37.077 回答
3

我处理了同样的场景,但是我们所做的是为您需要加载的每个分区创建单独的 HDFS 数据文件。

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

于 2013-01-11T14:59:34.863 回答
2

怎么样

LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');

于 2018-11-23T10:48:43.567 回答
-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.指示hive动态加载分区

SET hive.exec.dynamic.partition = true;

SET hive.exec.dynamic.partition.mode = nonstrict;
于 2018-09-12T07:34:18.177 回答