将HDFS目录与.tsv文件映射到Hive

时间:2014-06-12 20:43:04

标签: hadoop hive hdfs

我将HFDS中的数据作为.tsv格式。我需要将它们加载到Hive表中。我需要一些帮助。

HDFS中的数据如下:

/ad_data/raw/reg_logs/utc_date=2014-06-11/utc_hour=03

注意:数据每天和每小时加载到HDFS目录/ ad_data / raw / reg_logs。

此HDFS目录中有3个.tsv文件:

funel1.tsv
funel2.tsv
funel3.tsv

每个.tsv文件有3个以制表符分隔的列,其数据如下:

2344    -39 223
2344    -23 443
2394    -43 98
2377    -12 33
...
...

我想用3列id int,region_code int和count int创建一个Hive模式,就像在HDFS中一样。如果可能的话,我想在Hive表中删除那个负号,但不是什么大不了的。

我创建了一个带有架构的Hive表:(如果我错了请纠正我)

CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING, utc_hour STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/raw/reg_logs';

我想要做的就是将数据从HDFS复制到Hive。我不想在路径中使用"加载数据' ..'进入表reg_logs"因为我不想每天手动输入数据。我只想将Hive表指向HDFS目录,这样它就会自动获取每天的数据。

我怎样才能实现它?如果需要,请更正我的hive表架构以及获取数据的方法。

==

第二部分:

我想创建另一个表reg_logs_org,它将从reg_logs中填充。我需要将reg_logs_org中的所有内容放在小时列旁边的reg_logs中。

我创建的架构是:

CREATE EXTERNAL TABLE IF NOT EXISTS reg_logs_org (
id int,
region_code int,
count int
)
PARTITIONED BY (utc_date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/ad_data/reg_logs_org';

从reg_logs:

将数据插入reg_logs_org
insert overwrite table reg_logs_org
select id, region_code, sum(count), utc_date
from 
reg_logs
group by 
utc_date, id, region_code

错误消息:

FAILED: SemanticException 1:23 Need to specify partition columns because the destination table is partitioned. Error encountered near token 'reg_logs_org'

==

Thank you,
Rio

1 个答案:

答案 0 :(得分:1)

你非常接近。最后一步是您需要将分区信息添加到Hive的Metastore中。 Hive单独存储每个分区的位置,并且它不会自动查找新分区。添加分区有两种方法:

  1. 每小时做一次add partition声明:

    alter table reg_logs add partition(utc_date='2014-06-11', utc_hour='03')
    location '/ad_data/raw/reg_logs/utc_date=2014-06-11/utc_hour=03';
    
  2. 每小时(或不太频繁)进行表修复。这将扫描根表位置以查找尚未添加的任何分区。

    msck repair table reg_logs;
    
  3. 第一种方法有点痛苦,但效率更高。第二种方法很简单,但每次都会对所有分区进行全面扫描。

    编辑:问题的后半部分:

    您只需添加一些语法,以便使用动态分区插入表中。一般来说,它是:

    insert overwrite [table] partition([partition column])
    select ...
    

    或者在你的情况下:

    insert overwrite table reg_logs_org partition(utc_date)
    select id, region_code, sum(count), utc_date
    from 
    reg_logs
    group by 
    utc_date, id, region_code