简介
针对已经存放在hdfs上的文件,创建hive表。这里推荐创建外表,因为hive外表被删除,对应目录的数据不会被清除。
步骤
step1. 根据hdfs的数据字段,创建hive表。
CREATE EXTERNAL TABLE if not exists push_log(
ip STRING COMMENT 'IP Address of the User',
imei STRING,
gameid STRING,
channelid STRING,
lan STRING 'language',
country STRING COMMENT 'country of origination',
mac STRING,
ver STRING,
phonetype STRING,
sver STRING,
tver STRING,
plmn STRING)
COMMENT 'This is the staging push log table'
PARTITIONED BY (hostid STRING, dayid STRING) **# 指定分区**
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001'
STORED AS TEXTFILE
LOCATION '/user/data/push';
若该表有分区,则在创建时指定分区,这点很重要。
虽然创建了分区,分区里面也有数据,但是这时候hive表依然不能识别分区数据。还需要添加分区操作
step2. 添加分区(更贴切说,应该是指定分区)
alter table push_log add partition(hostid='$hostid', dayid='$dayid') location '/user/data/push/$hostid/$dayid';
完成上面操作后,这时候从hive中就能读取到添加的分区数据,当然如果是lzo文件的话,还需要修改FileFormat,详见上篇文章
总结
若有任何问题和建议,可以留言讨论。
在操作过程中,发现了一些提高工作效率的方法。比如批量生成lzo的索引方式(详见上篇文章)。