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

使用shell脚本依据分区信息分批次的下载hive表格数据的更多相关文章

  1. SHELL脚本实现分区

    写一个脚本(前提:请为虚拟机新增一块硬盘,架设它为/dev/sdb),为指定的硬盘创建分区 1,列出当前系统上所有的磁盘,让用户选择,如果选择quit则退出脚本:如果用户选择错误,就让用户重新选择 2 ...

  2. Linux下基于shell脚本实现学生信息管理系统

    #该管理系统是参考两位博主(时间有点远了,我忘了,请博主看到后联系我)后自行修改添加的.登录过程还有很多不完善,我就抛砖引玉啦. 废话不多,直接上码! #!/bin/bash# 学生管理系统# @ve ...

  3. python在linux调用shell脚本实时打印输出信息并对信息进行判断

    核心代码 def run(command): #实时获取打印的命令 process = Popen(command, stdout=PIPE, shell=True) while True: line ...

  4. shell脚本 系统状态信息查看

    一.简介 源码地址 日期:2018/6/23 介绍:显示简单的系统信息 效果图: 二.使用 适用:centos6+,ubuntu12+ 语言:中文 注意:无 下载 wget https://raw.g ...

  5. 使用linux 的shell脚本进行sftp文件上传与下载

    一.批量上传: #!/bin/bash #SFTP配置信息 #用户名 USER=root #密码 PASSWORD=5EYS40T04BMF #待上传文件根目录 SRCDIR=/u02/dab/sft ...

  6. fdisk分区硬盘并shell脚本自动化

    最近工作需要用到对硬盘进行shell脚本自动化分区和mount的操作,google了一些资料,下面做个总结. 如果硬盘没有进行分区(逻辑分区或者扩展分区,关于两者概念,自行google),我们将无法将 ...

  7. 初阶项目一-集成一套linux系统:红帽系统,LVM分区,Apache服务,MySQL服务,数据定时备份脚本

    目录 一.项目目标 二.实施工具 三.项目实施计划 四.安装rhel7.5操作系统 4.1 配置虚拟机 4.2 安装操作系统 4.3 系统配置 4.3.1 网络配置 4.3.2 修改主机名 4.3.3 ...

  8. shell 脚本加密

    日常编写shell脚本时会写一些账号和密码写入脚本内,但是不希望泄露账号密码,所以对shell脚本进行加密变成可执行文件. 主要使用 shc 对 Linux shell 脚本加密,shc是一个专业的加 ...

  9. shell脚本基础编写

    shell脚本的格式 名称:Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将 .sh 后缀加上,以表示是一个脚本文件. shell 脚本中一般会出现三种不同的元素: 第一行的脚 ...

随机推荐

  1. 合唱队(华为OJ)

    描述 计算最少出列多少位同学,使得剩下的同学排成合唱队形 说明: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左 ...

  2. 洛谷P4925 [1007]Scarlet的字符串不可能这么可爱(计数)

    题意 题目链接 Sol 只要知道"回文连续子串"就能做了吧.. 想要满足这个条件,肯定是不能出现\(aa\)或\(aba\)这种情况 如果没有\(S\)的限制,答案为\(K * ( ...

  3. agc027D - Modulo Matrix(构造 黑白染色)

    题意 题目链接 构造一个\(n * n\)的矩阵,要求任意相邻的两个数\(a,b\),使得\(max(a,b) \% min(a,b) \not = 0\) Sol 我的思路: 假设\(mod = 1 ...

  4. css3照片墙

    一张张照片散乱的撒在一起,鼠标悬浮时旋转放大并摆正,效果如下图(所有图片均来自网络),主要使用到的css3属性有:transition.transform(scale.rotateZ).box-sha ...

  5. Unity利用AnimationCurve做物体的各种运动

    ​之前一直都是自己学习Unity各种做Demo,最近开始正式使用Unity来做一个款2d的游戏. 其中在做一个类似小球弹跳运动的时候遇到了点问题,查找了很多资料,无意间发现AnimationCurve ...

  6. CSS:响应式下的折叠菜单(条纹式)

    原文:CSS: Responsive Navigation Menu 译文:CSS:响应式导航菜单 译者:dwqs 写在之前,关于如何制作响应式的下拉菜单:响应式下的下拉菜单 之前,我写了一篇关于怎么 ...

  7. POJ-3041 Asteroids---二分图&最小覆盖点

    题目链接: https://vjudge.net/problem/POJ-3041 题目大意: 给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍, 最少要几次. 解 ...

  8. react里面Fragments的使用

    关于react Fragments,React 中一个常见模式是为一个组件返回多个元素.Fragments 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点. render() { retur ...

  9. .net 开源的网站

    https://www.zhihu.com/question/24408855 https://www.zhihu.com/question/19840134 这两个知乎的答案 介绍部分经典的.net ...

  10. redis redis的连接

    昨天2017年12月26日,我刚刚从网上下载了redis.经过一天的摸索,踩了不少坑.昨天下午,比较磕磕巴巴,今天早上 终于比较完善地完成了一次小操作. 使用cmd的重要步骤 1.输入redis-se ...