最近工作中使用到了Hive,  并对Hive 的数据库,表完成创建。

创建的表为分区表,也涉及到了分区表 的按天动态增加分区。

代码组织结构:

创建数据库:

create_dmp.hql

--dmp 数据库存储了dmp所需要的数据

CREATE DATABASE IF NOT EXISTS `dmp`

WITH DBPROPERTIES ('creator' = 'sunzhenhua', 'create_date' = '2018-06-07');

执行创建命令

hive -f create_dmp.hql

创建表:

create_clearlog.hql

--dmp_clearlog 存放了清洗过后的投放信息--分区表: 按天分区--外部表

USE dmp;

CREATE EXTERNAL TABLE IF NOT EXISTS `dmp_clearlog` (

`date_log`string COMMENT 'date in file',

`hour`int COMMENT 'hour',

`device_id`string COMMENT '(android) md5 imei / (ios) origin mac',

`imei_orgin`string COMMENT 'origin value of imei',

`mac_orgin`string COMMENT 'origin value of mac',

`mac_md5`string COMMENT 'mac after md5 encrypt',

`android_id`string COMMENT 'androidid',

`os`string COMMENT 'operating system',

`ip`string COMMENT 'remote real ip',

`app`string COMMENT 'appname')

COMMENT'cleared log of origin log'PARTITIONED BY (

`date` date COMMENT'date used by partition')

ROW FORMAT DELIMITED FIELDS TERMINATED BY','TBLPROPERTIES ('creator'='szh', 'crate_time'='2018-06-07')

;

在编写复杂创建表语句的时候着实遇到了很多问题,创建表的语句的书写格式是要遵循规范的。

具体的规范定义,参考我的博客:

这里我们编写了一个为 dmp.dmp_clearlog  动态增加分区的脚本:

脚本主要实现了以下几种功能:

1.对传入的日期参数进行校验 ,1)可以创建指定日期的分区,2)日期参数必须为yyyy-MM-dd格式

2.向hive执行传递参数

3.使用hive 新版的cli 工具,beeline执行 hql 文件 ,下面脚本包含了两种模式 hive-cli, beeline

延伸内容:

beeline 执行的详细讲解见我的另一篇博客

shell 中对字符串按指定分隔符进行划分的三种方法

shell 中正则表达式的应用

日期判断正则

date_pattern='^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$'

下面是我的脚本

load_hdfs_data_into_dmp_clearlog.sh

#! /bin/bashset -o errexit

source/etc/profile

source~/.bashrc

ROOT_PATH=$(dirname $(readlink -f $0))

echo $ROOT_PATH

date_pattern_old='^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$'date_pattern='^[0-9]{4}-((0([1-9]{1}))|(1[1|2]))-(([0-2]([0-9]{1}))|(3[0|1]))$'#参数数量

argsnum=$#

#一些默认值

curDate=`date +%Y%m%d`

partitionDate=`date -d '-1 day' +%Y-%m-%d`

fileLocDate=`date -d '-1 day' +%Y-%m-%d`

#日志存放位置

logdir=load_hdfs_data_logs

function tips() {

echo"Usage : load_data_into_dmp_clearlog.sh [date]"echo"Args :"echo"date"echo"date use this format yyyy-MM-dd , ex : 2018-06-02"echo"============================================================"echo"Example :"echo"example1 : sh load_data_into_dmp_clearlog.sh"echo"example2 : sh load_data_into_dmp_clearlog.sh 2018-06-02"}if [ $argsnum -eq 0] ; then

echo"No argument, use default value"elif [ $argsnum-eq 1] ; then

echo"One argument, check date pattern"arg1=$1

if ! [[ "$arg1" =~$date_pattern ]] ; then

echo-e "\033[31m Please specify valid date in format like 2018-06-02"echo-e "\033[0m"tips

exit1fi

#echo $arg1|tr "-" " "dateArr=($(echo $arg1 |tr "-" " "))

echo"dateArr length is"${#dateArr[@]}

partitionDate=${dateArr[0]}-${dateArr[1]}-${dateArr[2]}

fileLocDate=${dateArr[0]}"-"${dateArr[1]}"-"${dateArr[2]}elseecho-e "\033[31m Not valid num of arguments"echo-e "\033[0m"tips

exit1fiif [ ! -d "$logdir"]; then

mkdir-p $logdir

fi

echo ${partitionDate}

cd $ROOT_PATH

#nohup hive-hivevar p_date=${partitionDate} -hivevar f_date=${fileLocDate} -f hdfs_add_partition_dmp_clearlog.hql >> $logdir/load_${curDate}.log

nohup beeline-u jdbc:hive2://10.180.0.26:10000 -n cloudera-scm --color=true --silent=false --hivevar p_date=${partitionDate} --hivevar f_date=${fileLocDate} -f hdfs_add_partition_dmp_clearlog.hql >> $logdir/load_${curDate}.log

View Code

执行脚本示例: (参数校验)

最后动态增加分的脚本

USE dmp;

ALTER TABLE `dmp_clearlog` ADD IF NOT EXISTS PARTITION (`date`='${hivevar:p_date}') LOCATION 'hdfs://dmp-big001.a1.bj.jd:8020/bigdata/clearedLog/Device/${hivevar:f_date}';

hive动态分区shell_Hive/Shell 创建Hive 库 ,表脚本,Hive 动态增加分区脚本相关推荐

  1. hive的数据定义之创建数据库和表

    1.对数据库的操作 create database hive_db //创建数据库hive_db create table hive_db.test(字段) //在数据库hive_db中创建test表 ...

  2. 新加装的硬盘,装上系统后发现EFI分区没有被创建,还是用旧硬盘的EFI分区

    引发问题:如果没有旧硬盘就没法引导系统,没法开机. 解决办法:在新硬盘增加一个EFI分区. 目前情况大概就是这个样子:(本人忘了截图,用别人的) 可见,装好系统在HD0后,只有一个MSR分区,没有ES ...

  3. mysql表分区占用存储_MySQL 分区分表应用场景分析和分区中可能遇到的坑点

    MySQL的分区和分表应用场景分析 在日常工作中当我们的某张表的数据量过大的时候,首当其冲的可能就是进行分区和分表,但是是如何分区或者分表都要结合一点的业务场景下进行分析,才会显著的提升性能,来聊一聊 ...

  4. 建立efi分区_电脑维修不求人之几条命令无损增加分区的方法

    很多品牌计算机厂家在设备出厂时,只给用户留了一个分区,不论用户的硬盘有多大.很多人觉得分区是一件很复杂的事情,尤其是在听说分区有可能损坏数据时,就更不敢擅自更改.增加分区.其实,增加一个分区是分分钟的 ...

  5. linux df是否分区,Linux中df命令查询磁盘信息和fdisk命令分区的用法

    df - 报告文件系统磁盘空间的使用情况 总览 df [option]... [file]... posix 选项: [-kp] gnu 选项 (最短方式): [-ahhiklmpv] [-t fst ...

  6. 输入压缩空间量是分区量吗_硬盘只有C盘如何增加分区

    硬盘只有一个C盘如何增加分区呢?新买的笔记本电脑很多都是固态硬盘120G,基本只要一个系统分区,如何不影响系统的情况下给C盘增加分区呢?下面让小白系统教你不用重装系统给C盘增加分区. 增加分区 使用自 ...

  7. hive动态分区shell_Hive动态分区 参数配置及语法

    Hive本身是不支持动态分区的.. 但动态分区是真的方便啊..不然手动维护要累死..按日期甚至小时来分区时动辄就好几千上万的分区..手动到哪一年去..? 想要用动态分区要先做一些设置来修改默认的配置. ...

  8. Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

    1.  Hive基本操作 1.1DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_nam ...

  9. shell 创建表 连接db2_大数据技术之SparkSQL(七)连接Hive数据库

    Apache Hive是Hadoop上的SQL引擎,Spark SQL编译时可以包含Hive支持,也可以不包含.包含Hive支持的Spark SQL可以支持Hive表访问.UDF(用户自定义函数)以及 ...

最新文章

  1. 算法-----礼物的最大价值
  2. java singleton 多线程_Java创建线程安全的单例singleton
  3. WebX.0:Web1.0
  4. SAP UI5 busy dialog - SVG
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的客户关系CRM系统
  6. linux6.5配置ssh,CentOS 6.5 配置 SSH 免密登录
  7. 是谁榨干了 Android 设备的电量和流量?!| 极客头条
  8. 浪漫桃心的Android表白程序
  9. 电脑硬件知识学习_计算机的发展史,你对硬件知识了解多少,带大家了解一下....
  10. 00110_Class类
  11. 中国搜索20年:巨头百度的兴衰密码
  12. 光耦w314的各引脚图_常用光耦型号代换大全
  13. 如何消除win10文件右上角的蓝色箭头
  14. HFDS 内部工作机制
  15. Linux 普通用户和root用户任意切换
  16. 时序模型:长短期记忆网络(LSTM)
  17. node.js 最全命令行配置操作win10
  18. ios13全选手势_iOS13大揭秘:深色模式、多任务、新手势等
  19. Win2003集群简介
  20. 360杀毒属于计算机操作系统吗,360杀毒软件 统一操作系统UOS,保护您的电脑安全...

热门文章

  1. 哪款浏览器速度最快_全球知名度非常高的火狐浏览器,它好在哪呢?
  2. php伪协议漏洞_PHP之伪协议深入理解
  3. sqlbulkcopy能用于mysql吗_混凝土自动上料搅拌车能用于农村盖房吗?
  4. php flush 逐行显示_PHP逐行输出(ob_flush与flush的组合)
  5. ipv6远程连接mysql_如何利用IPv6进行远程桌面连接
  6. Git 标签(tag)相关操作
  7. react-native 第三方库
  8. sftp api java_SFTP例子2----使用JSch实现SFTP文件传输
  9. Java Swing Mysql学生成绩管理系统
  10. yntaxError: Non-UTF-8 code starting with ‘\xe6‘ in file