zoukankan      html  css  js  c++  java
  • 使用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 '	'
    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中实现循环日期的实例代码-具体看的是这篇博文的下半部分的代码

  • 相关阅读:
    如何:将控件锁定到 Windows 窗体
    Linux 设置字符集
    sql 批量处理
    解决表被锁了
    oracle 分页模板
    创建用户及表空间
    恢复数据库数据
    instr vs like 效率
    自定义参数转换器
    spring boot 整合MyBatis
  • 原文地址:https://www.cnblogs.com/lzida9223/p/10536255.html
Copyright © 2011-2022 走看看