使用shell脚本依据分区信息分批次的下载hive表格数据

时间:2019-03-15
本文章向大家介绍使用shell脚本依据分区信息分批次的下载hive表格数据,主要包括使用shell脚本依据分区信息分批次的下载hive表格数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天的业务场景大概是这样的,我想把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 '\t'
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中实现循环日期的实例代码-具体看的是这篇博文的下半部分的代码