今天的业务场景大概是这样的,我想把hive表格下载到本地文件系统,然后把这个文件传送到另一个服务器上。
但是这个业务场景一个核心问题就是说我本地机器内存有限,hive表格大概是70G,我是不可能全部下载到本地的。这个时候我想到的一个方法就是依靠分区实现这个目的。
首先这个hive表格的内容大概是这样的-temp_zida_uids_bowen_content_new_zida:
uid,mid,content,date
是没有分区信息。
我首先要做的就是将这个表格改为具有分区。这种情况我们使用的方法就是将这个原始hive表格加上动态分区。对这方面我参考的就是Hive如何根据表中某个字段动态分区和Hive分区(静态分区+动态分区)还有hive分区表详细介绍
vim transform_fenqu.sh
大致代码就是这样:
function create(){
cat <<EOF
CREATE TABLE IF NOT EXISTS temp_zida_bowen_fenqu_now(uid string,mid string,content string)
partitioned by (date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
LOCATION '/dw_ext/weibo_bigdata_ugrowth/mds/temp_zida_bowen_fenqu_now';
EOF
}
function set(){
cat <<EOF
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
insert into table temp_zida_bowen_fenqu_now partition (date) select * from temp_zida_uids_bowen_content_new_zida;
EOF
}
hive -e "`create`"
echo "1"
hive -e "`set`"
echo '2'
这样我们的表格就具有动态分区,我们可以写一个代码检查一下能不能成功
hive -e "show partitions temp_zida_bowen_fenqu_now"|sort -r
hive -e "show partitions temp_zida_bowen_fenqu_now"|sort -r|sed -n '1p'|cut -b 4-11
然后接下来我们要做的就是根据分区下载每个分区对应的数据,然后传送到另一个服务器上,大概的代码如下:
#! /bin/bash
dt_ods_tblog_content=`hive -e "show partitions ods_tblog_content"|sort -r|sed -n '1p'|cut -b 4-11`
date_e=`date -d"1 day ago" +%Y%m%d`
date_90ago=`date -d"$date_e -89 day" +"%Y%m%d"`
dt_ods_tblog_content_90days_ago=$date_90ago
first=$date_90ago
second=$dt_ods_tblog_content
while [ "$first" -le "$second" ]
do
hive -e "select uid,mid,content from temp_zida_bowen_fenqu_now where date=$first" >./data/$first
rsync -av ./data/$first 172.16.142.33::rsyncpath/data_bowen
rm ./data/$first
echo $first
let first=`date -d "-1 days ago ${first}" +%Y%m%d`
done
在这个shell代码中涉及到一个日期循环的语句,我是参考的这里的代码linux shell中实现循环日期的实例代码-具体看的是这篇博文的下半部分的代码