Hive(24):实例:hive shell脚本实现自动加载数据

一、实现功能

日志文件需要按时自动上传到hdfs、hive,然后,才可以进行下一步的ETL。所以,定时定点将日志信息按时上传时非常重要的。

二、实现

1.hive中创建源表

create database load_hive;

create table load_hive.load_tb(
id              string,
url             string,
referer         string,
keyword         string,
type            string,
guid            string,
pageId          string,
moduleId        string,
linkId          string,
attachedInfo    string,
sessionId       string,
trackerU        string,
trackerType     string,
ip              string,
trackerSrc      string,
cookie          string,
orderCode       string,
trackTime       string,
endUserId       string,
firstLink       string,
sessionViewNo   string,
productId       string,
curMerchantId   string,
provinceId      string,
cityId          string,
fee             string,
edmActivity     string,
edmEmail        string,
edmJobId        string,
ieVersion       string,
platform        string,
internalKeyword string,
resultSum       string,
currentPage     string,
linkPosition    string,
buttonPosition  string
)partitioned by(`date` string,hour string)
row format delimited fields terminated by "\t";

2.通过hive -e的方式

(1)创建一个脚本 load_to_hive.sql

#!/bin/sh
#拿到昨天日期,例如:20180526
YESTERDAY=`date -d '-1 days' +%Y%m%d`

ACCESS_LOG_DIR=/opt/access_logs/$YESTERDAY

#HIVE_HOME=/opt/modules/class22/apache-hive-1.2.1-bin
HIVE_HOME=/opt/modules/hive-1.2.1

for file in `ls $ACCESS_LOG_DIR`
do
	DAY=${file:0:8}
	HOUR=${file:8:2}
	echo "${DAY}${HOUR}"
	$HIVE_HOME/bin/hive -e "load data local inpath '$ACCESS_LOG_DIR/$file' into
	table load_hive.load_tb partition(date='${DAY}',hour='${HOUR}')"
done
	$HIVE_HOME/bin/hive -e "show partitions load_hive.load_tb"
	

(2)创建目录

/opt/access_logs/20180526

(3)把日志文件都考过来并且改名字

[root@bigdata access_logs]# cd 20180526/
[root@bigdata 20180526]# cp /opt/datas/2015082818 ./
[root@bigdata 20180526]# cp /opt/datas/2015082819 ./
[root@bigdata 20180526]# mv 2015082818 2018052601.log
[root@bigdata 20180526]# mv 2015082819 2018052602.log
[root@bigdata 20180526]# cp /opt/datas/2015082819 ./ 
[root@bigdata 20180526]# mv 2015082819 2018052603.log

(4)hive-site添加,取消关键字检查
 

        <property>
          <name>hive.support.sql11.reserved.keywords</name>
          <value>false</value>
        </property>

(5)hive目录下执行脚本

sh -x load_to_hive.sql

(6)重新启动hiveserver2和beeline

(7)执行脚本

sh -x load_to_hive.sql

结果:
partition
date=20180526/hour=01.log
date=20180526/hour=02.log
date=20180526/hour=03.log
Time taken: 1.994 seconds, Fetched: 3 row(s)

(8)查看表的分区:

show partitions load_hive.load_tb;

3. 通过hive -f的方式

  可以通过--hiveconf 传递参数

(1)日志目录

在/opt/access_logs/20181110下面有以下三个日志文件
mv 2017120901.log 2018052601.log
mv 2017120902.log 2018052602.log
mv 2017120903.log 2018052603.log

(2)创建一个文件:/opt/datas/hive_shell/load.sql

vi load.sql

添加

load data local inpath '${hiveconf:log_dir}/${hiveconf:file_path}' into table load_hive.load_tb partition (date='${hiveconf:DAY}',hour='${hiveconf:HOUR}')

(4)编写load_to_hive_file.sh

#! /bin/bash

#定义昨天的日期时间
YESTERDAY=`date -d '-1 days' +%Y%m%d`

#定义数据目录
ACCESS_LOG_DIR=/opt/access_logs/$YESTERDAY

#定义HIVE_HOME
HIVE_HOME=/opt/modules/hive-1.2.1

#定义遍历目录下文件名称,获取日期和时间指定分区
for FILE in `ls $ACCESS_LOG_DIR`
do
    DAY=${FILE:0:8}
	HOUR=${FILE:8:2}
	#echo "${DAY}${HOUR}"
    $HIVE_HOME/bin/hive --hiveconf log_dir=$ACCESS_LOG_DIR --hiveconf file_path=$FILE --hiveconf DAY=$DAY --hiveconf HOUR=$HOUR -f '/opt/datas/hive_shell/load.sql'
done
    $HIVE_HOME/bin/hive -e "show partitions load_hive.load_tb"

(5)删除表中数据

truncate table load_hive.load_tb;

(6)查看分区并且删除全部分区

show partitions load_hive.load_tb;

+----------------------------+--+
|         partition          |
+----------------------------+--+
| date=20180526/hour=01      |
| date=20180526/hour=02      |
| date=20180526/hour=03      |
+----------------------------+--+

删除分区

alter table load_hive.load_tb drop partition(date='20180526',hour='01');
alter table load_hive.load_tb drop partition(date='20180526',hour='02');
alter table load_hive.load_tb drop partition(date='20180526',hour='03');

(7)加载数据

sh -x load_to_hive_file.sh 

(8)结果(在脚本中写了)

date=20180526/hour=01
date=20180526/hour=02
date=20180526/hour=03

 

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些代码范例,用于实现自动备份Hive数据,并根据时间传参。请先确保您已经安装好了Hive客户端和hadoop。 以下是一个简单的shell脚本,用于备份Hive数据,并根据时间传参: ```shell #!/bin/bash # 设置Hive表名和备份目录 table_name=$1 backup_dir=$2 # 获取当前日期和时间,作为备份文件名的一部分 current_time=$(date "+%Y-%m-%d_%H-%M-%S") # 备份Hive数据到本地目录 hive -e "INSERT OVERWRITE LOCAL DIRECTORY '${backup_dir}/${table_name}_${current_time}' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT * FROM ${table_name};" # 打包备份文件 tar -czvf ${table_name}_${current_time}.tar.gz ${backup_dir}/${table_name}_${current_time} # 删除备份目录中的原始备份文件 rm -rf ${backup_dir}/${table_name}_${current_time} # 将备份文件上传至HDFS hadoop fs -mkdir -p /user/hive/backup/${table_name} hadoop fs -put ${table_name}_${current_time}.tar.gz /user/hive/backup/${table_name} # 删除本地备份文件 rm -rf ${table_name}_${current_time}.tar.gz ``` 将以上代码保存为一个脚本文件 `backup_hive_table.sh`,并为该文件添加执行权限: ```shell chmod +x backup_hive_table.sh ``` 接着,您可以在终端中调用该脚本,并传递Hive表名和备份目录作为参数。例如,如果您想备份名为 `my_table` 的Hive表,并将备份文件保存在本地 `/backup` 目录下,您可以执行以下命令: ```shell ./backup_hive_table.sh my_table /backup ``` 希望以上代码范例能够帮助您实现自动备份Hive数据,并根据时间传参。如果您有任何疑问或需要进一步帮助,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值