Shell脚本加载hdfs中多级分区数据至hive表中

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章