1、查看hdfs中存储数据的所有目录,共有三个分区:month_id,day_id,prov_id,数据存储目录在/user/hive/data
2、创建相应数据表,主要指定这三个分区,摘写分区语句
partitioned by (month_id int,day_id int,prov_id int)
hive中数据存储目录在/user/hive/warehouse/table_name
3、编写脚本
#!/bin/sh
tbl_name=$1
for p1 in `hadoop fs -ls /user/hive/data | awk '{print $8}'`
do
month_id=`echo $p1 | awk -F '=' '{print $2}'`
for p2 in `hadoop fs -ls $p1 | awk '{print $8}'`
do
day_id=`echo $p2 | awk -F '=' '{print $3}'`
for p3 in `hadoop fs -ls $p2 | awk '{print $8}'`
do
prov_id=`echo $p3 | awk -F '=' '{print $4}'`
hive -e "load data inpath '/user/hive/data/month_id=$month_id/day_id=$day_id/prov_id=$prov_id/*' overwrite into table $tbl_name partition(month_id=$month_id,day_id=$day_id,prov_id=$prov_id)"
done
done
done
tbl_name=$1:获取调用此脚本的第一个参数,指定目标表名称
`hadoop fs -ls /user/hive/data | awk '{print $8}'`:获取源数据一级目录,如下:
for p1 in xxxx:for循环,遍历源数据目录
month_id=`echo $p1 | awk -F '=' '{print $2}'`:获取分区字段值,如下:
hive -e "load data inpath '/user/hive/data/month_id=$month_id/day_id=$day_id/prov_id=$prov_id/*' overwrite into table $tbl_name partition(month_id=$month_id,day_id=$day_id,prov_id=$prov_id)":拼接源数据目录,指定目标目录,实现入库。
4、调用脚本
./hdfs_to_hive.sh pts