系统相关
首页 > 系统相关> > shell脚本实现hive增量加载

shell脚本实现hive增量加载

作者:互联网

实现思路:

1、每天凌晨将前一天增量的数据从业务系统导出到文本,并FTP到Hadoop集群某个主节点上

  上传路径默认为:/mnt/data/crawler/

2、主节点上通过shell脚本调用hive命令加载本地增量温江到hive临时表

3、shell脚本中,使用hive sql 实现临时表中的增量数据更新或者新增增量数据到hive 主数据表中

 

实现步骤:
1.建表语句, 分别创建两张表test_temp, test 表

[SQL] 纯文本查看 复制代码

?

crrawler.test_temp(

a.id         string,

a.name       string,

a.email      string,

create_time  string

)

row format delimited

fields terminated by ','

stored as textfile

;

+++++++++++++++++++++++++++++++++

create table crawler.test(

a.id         string,

a.name       string,

a.email      string,

create_time  string

)

partitioned by (dt string)

row format delimited

fields terminated by '\t'

stored as orc

;



2.编写处理加载本地增量数据到hive临时表的shell脚本test_temp.sh

[Shell] 纯文本查看 复制代码

?

#! /bin/bash

##################################

# 调用格式:                      #

# 脚本名称 [yyyymmdd]            #

# 日期参数可选,默认是系统日期-1 #

##################################

dt=''

table=test_temp

#获取当前系统日期

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

#获取昨日日期,格式: YYYYMMDD

yesterday=`date -d yesterday +%Y%m%d`

#数据文件地址

file_path=/mnt/data/crawler/

if [ $# -eq 1 ]; then

  dt=$1

elif [ $# -eq 0 ]; then

  dt=$yesterday

else

  echo "非法参数!"

  #0-成功,非0-失败

  exit 1

fi

filename=$file_path$table'_'$dt'.txt'

if [ ! -e $filename ]; then

  echo "$filename 数据文件不存在!"

  exit 1

fi 

hive<<EOF

 load data local inpath '$filename' overwrite into table crawler.$table;

EOF

if [ $? -eq 0 ]; then

  echo ""

  echo $dt "$table 加载成功!"

else

  echo ""

  echo $dt "$table 加载失败!"

fi



3.增量加载临时数据到主数据表的shell脚本test.sh

[Shell] 纯文本查看 复制代码

?

#! /bin/bash

##################################

table=test

#获取当前系统日期

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

 

#实现增量覆盖

hive<<EOF

set hive.exec.dynamic.partition=true; 

set hive.exec.dynamic.partition.mode=nonstrict;

insert overwrite table crawler.test partition (dt)

select a.id, a.name, a.email, a.create_time, a.create_time as dt

from (

  select id, name, email, create_time from crawler.test_temp

  union all

  select t.id, t.name, t.email, t.create_time

  from  crawler.test t

  left outer join crawler.test_temp t1

  on t.id = t1.id

  where t1.id is null

) a;

quit;

EOF

if [ $? -eq 0 ]; then

  echo $sysdate $0 " 增量抽取完成!"

else

  echo $sysdate $0 " 增量抽取失败!"

标签:shell,string,hive,test,table,dt,crawler,加载
来源: https://www.cnblogs.com/ingema/p/10605251.html