我把数据以.tsv格式输入hfds。我要把它们装进Hive里。我需要帮助。
hdfs中的数据如下:
/ad_data/raw/reg_logs/utc_date=2014-06-11/utc_hour=03
注意:数据每天和每小时都加载到hdfs目录/ad\u data/raw/reg\u logs中。
此hdfs目录中有3个.tsv文件:
funel1.tsv
funel2.tsv
funel3.tsv
每个.tsv文件有3列,用tab分隔,数据如下:
2344 -39 223
2344 -23 443
2394 -43 98
2377 -12 33
...
...
我想创建一个包含3列id int、region\u code int和count int的配置单元模式,与hdfs中的完全相同。如果可能的话,我想去掉那个负号,在Hive表里,但没什么大不了的。
我用schema创建了一个配置单元表:(如果我错了,请纠正我)
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。我不想使用“将数据输入路径“..”加载到表注册表日志中”,因为我不想每天手动输入数据。我只想将配置单元表指向hdfs目录,这样它就可以自动获取每天的数据。
我怎样才能做到呢?请更正我的配置单元表架构,如果需要和方法来获取数据。
第二部分:
我想创建另一个表reg\u logs\u org,它将从reg\u 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';
将数据从注册表日志插入注册表日志组织:
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条答案
按热度按时间o4hqfura1#
你很接近。最后一步是需要将分区信息添加到配置单元的元存储中。hive单独存储每个分区的位置,并且不会自动查找新分区。有两种方法可以添加分区:
每小时做一次
add partition
声明:每小时(或不经常)修一次table。这将扫描根表位置以查找尚未添加的分区。
第一种方法有点痛苦,但效率更高。第二种方法很简单,但每次都对所有分区进行完全扫描。
编辑:问题的后半部分:
您只需要添加一些语法,以便使用动态分区插入到表中。一般来说,它是:
或者在你的情况下: