shell脚本监控文件夹文件实现自动上传数据到hive表

news2024/11/16 3:18:23

sh createtb.sh “tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2”

数据库名:observation (脚本里写死了)

表名:tablename

指定名:field1,field2,field3,field4,field5,field6,field7

分区名:partition1,partition2

文件说明

本地上传的文件:/home/hive/observation/$table/*.txt

文件名格式:xx01_xx02_xxxx.txt (xx01为第一个分区名称,xx02为第二个分区名称)

比如文件名为 2019_10_02.txt(/home/hive/observation/tablename目录下),则脚本生成的hive导入语句为

load data local inpath ‘/home/hive/observation/tablename/2019_10_02.txt’ into table observation.tablename partition(partition1=‘2019’,partition2=‘10’);

脚本代码

1、输入字段,建hive表脚本 createtb.sh

#!/bin/bash

echo “---------createtb.sh--------------”

#string=“tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2”

string=$*

group=(${string//;/ })

for i in ${group[@]};do

((m++))

if [[ m -eq 1 ]];then

tables=$i

elif [[ m -eq 2 ]];then

fields=$i

else partitions=$i

fi

done

echo “tables:” $tables

echo “fileds:” $fields

echo “partitions:” $partitions

echo “-----------------”

field=(${fields//,/ })

partition=(${partitions//,/ })

创建表目录

( m k d i r − p / h o m e / h i v e / o b s e r v a t i o n / (mkdir -p /home/hive/observation/ (mkdirp/home/hive/observation/tables ; chmod 777 /home/hive/observation/$tables)

数据库名称,这里不作为参数用自变量写了

database=“observation”

hive 拼接语句,分为h1,h2,h3

h1是建表语句的前半部,h2是参数列表中间部分,h3是建表语句的后半部

h1=“create table d a t a b a s e . database. database.tables”

在当前目录下创建文本文件temp,如果文件存在则清空文件

$(> temp)

for 循环将参数追加到当前目录的temp文件,逗号分隔,echo -n 不换行

for i in ${field[@]};do

echo -n $i" varchar(255)," >> temp

done

h2取temp文本里的字符串

temp=$(cat temp)

将字符串最后的一个逗号去掉

h2=“(${temp%*,})”

在当前目录下创建文本文件tmp,如果文件存在则清空文件

$(> tmp)

for 循环将参数追加到当前目录的temp文件,逗号分隔,echo -n 不换行

for i in ${partition[@]};do

echo -n $i" varchar(255)," >> tmp

done

h3取temp文本里的字符串

tmp=$(cat tmp)

将字符串最后的一个逗号去掉

h3是建表语句的后半部

h3="

partitioned by

(${tmp%*,})

row format delimited

fields terminated by ‘\t’

lines terminated by ‘\n’

stored as textfile

location ‘/user/hive/warehouse/ d a t a b a s e . d b / database.db/ database.db/tables’;

"

echo h 1 h1 h1h2$h3

( h i v e − e " (hive -e " (hivee"h1 h 2 h2 h2h3")

$(rm -rf tmp temp)

echo “-------create hive table successfully--------”

创建数据日期日志目录

/home/log/hive/observation/$tables.log

#/bin/bash /home/hive/loadtb.sh

#exec /home/hive/loadtb.sh

#source /home/hive/loadtb.sh

#fork /home/hive/loadtb.sh

第一个参数为表名,第二个参数为分区字段

#/home/hive/loadtb.sh $tables $partitions

/home/hive/monitor.sh $*

echo “* * * * * su - root /home/hive/monitor.sh “$*”” >> /var/spool/cron/root

echo “* * * * * root /home/hive/monitor.sh “$*”” >> /etc/crontab

/home/hive/createtb.sh “tablename;field1,field2,field3,field4,field5,field6,field7;partition1,partition2”

2、监控目录脚本 monitor.sh

#!/bin/bash

-------------接收参数,解析字符串--------------

echo “---------monitor.sh--------------”

string=$*

group=(${string//;/ })

for i in ${group[@]};do

((m++))

if [[ m -eq 1 ]];then

tables=$i

elif [[ m -eq 2 ]];then

fields=$i

else partitions=$i

fi

done

tables=(${tables//;/ })

field=(${fields//,/ })

partition=(${partitions//,/ })

-------------接收参数,解析字符串--------------

第一个参数为表名,也是监控的文件夹名称

tables=$tables

echo “tables:$tables”

echo “----------监控目录----------”

获取当前数据文件夹下的文件数量

let “total= ( l s / h o m e / h i v e / o b s e r v a t i o n / (ls /home/hive/observation/ (ls/home/hive/observation/tables | wc -l)”

echo “数据文件数量:${total}”

let “logline= ( c a t / h o m e / l o g / h i v e / o b s e r v a t i o n / (cat /home/log/hive/observation/ (cat/home/log/hive/observation/tables.log | wc -l)”

echo “日志文件行数:${logline}”

如果文件为空,则初始化log文件

if (( logline==0 ));then

/home/log/hive/observation/$tables.log

初始化log文件,赋予10行默认时间值

for (( i=0;i<10;i++ ));do

( e c h o " 2020 − 01 − 0100 : 00 : 00.00000000 (echo "2020-01-01 00:00:00.00000000 (echo"2020010100:00:00.00000000i" >> /home/log/hive/observation/$tables.log)

done

fi

获取log文件中的最后一个日期

logdate= ( t a i l − n 1 / h o m e / l o g / h i v e / o b s e r v a t i o n / (tail -n 1 /home/log/hive/observation/ (tailn1/home/log/hive/observation/tables.log)

echo “log 日志最新日期:$logdate”

获取数据目录下的最新的日期

newdate= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/tables | tail -n -$total | awk ‘{print $6,$7}’ | head -n 1)

echo “数据目录最新日期:$newdate”

将两个时间转为时间戳

LOGDATE=date -d "$logdate" +%s

NEWDATE=date -d "$newdate" +%s

echo “log 日志最新时间戳:$LOGDATE”

echo “数据目录最新时间戳:$NEWDATE”

获取数据目录所有的日期信息

alldate= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/tables | tail -n -$total | awk ‘{print $6,$7}’)

echo “数据目录所有日期信息:”

echo “$alldate”

数据目录日期字符串长度

let len=${#alldate}

echo “数据目录日期字符串长度:$len”

由于日期信息是空格连续的,单个日期也有空格,所以需要特殊处理

for((i=0;i<total;i++));do

let start=i*30

date[ i ] = i]= i]={alldate:$start:30}

done

去除换行处理

for((i=0;i<total;i++));do

date[ i ] = i]= i]={date[$i]:0:29}

done

echo “字符串切割后的日期信息:”

echo “${date[*]}”

((n=-1))

echo “--------开始遍历数据目录----------”

for循环遍历数组date

数组是从最新遍历到最旧的

for((i=0;i<${#date[*]};i++));do

每次遍历得到数据日期时间戳

TIMECR=date -d "${date[$i]}" +%s

#echo $TIMECR

如果日志最新数据和遍历的数据相等

if [[ $LOGDATE -eq $TIMECR ]];then

#if {[ “ L T I M E " = " LTIME" = " LTIME"="{date[$i]}” ]];then

#echo “$LTIME”;echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {date[i]}

#echo “ i , i, i,LTIME,KaTeX parse error: Expected '}', got 'EOF' at end of input: {date[i]}”

echo $i

(( n=$i )) #拿到第n行数据

echo “有相同日期信息,截取最新日期到之前的日期信息”

echo “KaTeX parse error: Expected '}', got 'EOF' at end of input: {date[i]}${date[0]}”

echo “需要加载的这几行数据:$i”

break

fi

#echo KaTeX parse error: Expected '}', got 'EOF' at end of input: {date[i]}

done

echo “--------结束遍历数据目录----------”

echo “n=$n”

echo “取最新数据的第:$n个”

echo “最新数据是:${date[0]}”

n=-1则表明日志的最新日期里边没有文件里边的日期

此情况则视为所有数据都要加载到hive表里边

if (( n == -1 ));then

echo “n == -1 , 第一次加载数据, 所有数据加载到hive表, ${date[0]}, $newdate” >> /home/hive/judge.log

删除log第一行数据

( s e d − i ′ 1 d ′ / h o m e / l o g / h i v e / o b s e r v a t i o n / (sed -i '1d' /home/log/hive/observation/ (sedi1d/home/log/hive/observation/tables.log)

把之前读取的最新日期数据加到log文件下

echo " d a t e [ 0 ] " > > / h o m e / l o g / h i v e / o b s e r v a t i o n / {date[0]}" >> /home/log/hive/observation/ date[0]">>/home/log/hive/observation/tables.log

echo “” >> /home/log/hive/observation/$tables.log

/home/hive/loadtb_all.sh $tables $partitions

如果n==0表示没有最新数据(n=0为最新的数据),既不需要处理

elif (( n == 0));then

删除log第一行数据

( s e d − i ′ 1 d ′ / h o m e / l o g / h i v e / o b s e r v a t i o n / (sed -i '1d' /home/log/hive/observation/ (sedi1d/home/log/hive/observation/tables.log)

echo "n == 0 , 没有最新数据,${date[0]} "

echo "n == 0 , 没有最新数据,${date[0]} " >> /home/hive/judge.log

else

echo “最新数据:${date[0]}”

删除log第一行数据

( s e d − i ′ 1 d ′ / h o m e / l o g / h i v e / o b s e r v a t i o n / (sed -i '1d' /home/log/hive/observation/ (sedi1d/home/log/hive/observation/tables.log)

把之前读取的最新日期数据加到log文件下

echo " d a t e [ 0 ] " > > / h o m e / l o g / h i v e / o b s e r v a t i o n / {date[0]}" >> /home/log/hive/observation/ date[0]">>/home/log/hive/observation/tables.log

#echo “” >> /home/log/hive/observation/$tables.log

# ( s e d − i ′ 1 s / (sed -i '1s/ (sedi1s//2020-04-16 17:03:48.000000000/’ /home/log/hive/observation/tablename.log)

调用加载数据脚本,第一个参数为表名,第二个参数为分区字段,第三个为最新的第n个数据

echo “传递的第一个参数是: t a b l e s , 传 递 的 第 二 个 参 数 是 : tables, 传递的第二个参数是: tables,partitions, 传递的第三个参数是: n , 最 新 数 据 : n, 最新数据: n,{date[0]}” >> /home/hive/judge.log

/home/hive/loadtb_mid.sh $tables $partitions $n

fi

/home/hive/monitor.sh "tablename;field1,field2,field3,field4,field5,field6,field7;

partition1,partition2"

3、第一次 load into hive表脚本 loadtb_all.sh

#!/bin/bash

echo “------loadtb_all.sh–start------”

第一个参数为表名

table=$1

echo “表名参数:$table”

第二个参数为分区字段

partitions=$2

echo “分区参数:$partitions”

load data directory

DIR=/home/hive/observation/$table

partkey=(${partitions//,/ })

分区数为$m

let m=${#partkey[@]}

h1=“load data local inpath '/home/hive/observation/$table”

h3=“’ into table observation.$table partition”

allfiles= ( l s / h o m e / h i v e / o b s e r v a t i o n / (ls /home/hive/observation/ (ls/home/hive/observation/table/*.txt)

echo “allfiles:$allfiles”

echo “allfiles:$allfiles” >> /home/hive/allfiles_all.log

遍历目录,得到具体分区名称

for file in ${allfiles};do

part_all

echo “$file” >> /home/hive/allfiles_all.log

取最后一个/后的文件名称

h2=“${file##*/}”

echo “h2:$h2” >> /home/hive/allfiles_all.log

去掉文件名后缀.txt

str=${h2%%.*}

echo “str:$str” >> /home/hive/allfiles_all.log

分区名称分割,遍历文件名

partvalue=(${str//_/ })

分区拼接字符串

for (( i=0;i<m;i++ ));do

echo -n “KaTeX parse error: Expected '}', got 'EOF' at end of input: {partkey[i]}=‘KaTeX parse error: Expected '}', got 'EOF' at end of input: {partvalue[i]}’,” >> part_all

done

h4_tmp=$(cat part_all)

h4=“(${h4_tmp%*,});”

echo “ h 1 / h1/ h1/h2 h 3 h3 h3h4”

( h i v e − e " (hive -e " (hivee"h1/ h 2 h2 h2h3$h4")

#hive -e “load data local inpath '/home/hive/observation/ t a b l e ′ i n t o t a b l e o b s e r v a t i o n . table' into table observation. tableintotableobservation.table partition(partition1= i , p a r t i t i o n 2 = i,partition2= i,partition2=i);”

done

$(rm -rf part_all)

echo “------loadtb_all.sh–end------”

3、第N次 load into hive表脚本 loadtb_mid.sh

#!/bin/bash

echo “--------loadtb_mid.sh–start------”

第一个参数为表名

table=$1

echo “表名参数:$table”

第二个参数为分区字段

partitions=$2

echo “分区参数:$partitions”

第三个为最新的第n个数据

echo “第三个参数:$3”

echo “全部参数:$*”

N=$(($3))

echo “N为:$N”

partkey=(${partitions//,/ })

分区数为$m

let m=${#partkey[@]}

h1=“load data local inpath '/home/hive/observation/$table”

h3=“’ into table observation.$table partition”

allfiles= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/table/*.txt | awk ‘{print $9}’ | head -n ${N})

#allfiles= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/table/*.txt | head -n ${N})

allfiles= ( l s / h o m e / h i v e / o b s e r v a t i o n / (ls /home/hive/observation/ (ls/home/hive/observation/table/*.txt | tail -n ${N})

表名

table=$1

echo “表名参数:$table”

第二个参数为分区字段

partitions=$2

echo “分区参数:$partitions”

第三个为最新的第n个数据

echo “第三个参数:$3”

echo “全部参数:$*”

N=$(($3))

echo “N为:$N”

partkey=(${partitions//,/ })

分区数为$m

let m=${#partkey[@]}

h1=“load data local inpath '/home/hive/observation/$table”

h3=“’ into table observation.$table partition”

allfiles= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/table/*.txt | awk ‘{print $9}’ | head -n ${N})

#allfiles= ( l s − − f u l l − t i m e − l t / h o m e / h i v e / o b s e r v a t i o n / (ls --full-time -lt /home/hive/observation/ (lsfulltimelt/home/hive/observation/table/*.txt | head -n ${N})

allfiles= ( l s / h o m e / h i v e / o b s e r v a t i o n / (ls /home/hive/observation/ (ls/home/hive/observation/table/*.txt | tail -n ${N})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分别使用Alpine、Docker制作jdk镜像

目录 制作 jdk 1.0 镜像 ——Docker 1.创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件 2.编写 Dockerfile 文件 3.执行Dockerfile文件&#xff0c;初次依赖镜像的时候会下载相应镜像 优化制作jdk镜像&#xff08;缩小内存大小&#xff09;——使用alpine …

【致敬世界杯】球迷(我)和足球的故事

目录 一、第一次接触足球 二、回味无穷的2018世界杯 三、致敬世界杯 3.1 源代码 3.2 思路 3.3 关于图片 一、第一次接触足球 踢足球是一项优秀的运动&#xff0c;它可以锻炼身体&#xff0c;增强团队合作精神&#xff0c;并为人们带来快乐和满足感。回忆起小学时候第一次…

OpenCV和RTSP的综合研究

一、RTSP是什么&#xff1f;用来干什么&#xff1f; RTSP&#xff08;Real Time Streaming Protocol&#xff09;&#xff0c;RFC2326&#xff0c;实时流传输协议&#xff0c;是TCP/IP协议体系中的一个应用层协议&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交的IET…

四旋翼无人机学习第14节--PCB Editor简单绘制封装-1

文章目录1 前言1.1 网络获取1.2 封装软件生成1.3 立创商城封装转化1 前言 在之前的博客中&#xff0c;我们绘制了封装所需的焊盘&#xff0c;有了焊盘我们就可以绘制封装啦。当然封装的获取有很多途径&#xff0c;下面我来总结一下。 1.1 网络获取 (有需要的可以下载哦&…

华为eNSP模拟器配置MSTP多实例生成树

传统的stp、rstp有其必然的缺陷 1.统一局域网内所有的vlan共享一个生成树&#xff0c;无法在vlan间实现数据流量的负载均衡。 2.链路利用率低&#xff0c;被阻塞的冗余链路不承载任何流量&#xff0c;造成了带宽的浪费&#xff0c;还可能造成部分vlan报文无法转发。MSTP在它们…

计算机毕业设计springboot+vue基本微信小程序的学习资料共享小程序

项目介绍 前台为用户使用的,包括下面一些功能&#xff1a; ① 资料发布&#xff1a;用户可以将想要共享的资料发布到小程序,供他人购买。 ②搜索 &#xff1a;分为按名称搜索和分类搜索,用户可选择其中一种方式,检索自己所需要的资料。 ③ 查看资料详情&#xff1a;用户可以…

学委必备小工具——筛选未提交人数【python小工具】

问题描述 作为一个学委&#xff0c;通常的任务就是收取班级作业&#xff0c;然后向老师报告当前未交人员的名单 JS版本&#xff1a;实现以一个表格数据查询另一个表格【JS】 之前我已经尝试通过用JS实现了&#xff0c;本质上差别其实也不是很大&#xff0c;只是对于JS来说&…

Java基础之《netty(11)—netty模型》

一、简单说明 1、工作原理示意图 netty主要基于主从Reactors多线程模型做了一定的改进&#xff0c;其中主从Reactor多线程模型有多个Reactor。 2、说明 &#xff08;1&#xff09;BossGroup线程维护selector&#xff0c;只关注Accept事件。 &#xff08;2&#xff09;当接收到…

[附源码]Node.js计算机毕业设计出版社样书申请管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

第十一章 特征选择与稀疏学习

11.1 子集搜索与评价 我们将属性称为特征&#xff0c;对当前学习任务有用的属性称为相关特征、没什么用的属性称为无关特征。还有一类特征称为冗余特征&#xff0c;它们所包含的信息能从其他特征中推演出来&#xff0c;冗余特征在很多时候不起作用&#xff0c;去除它们会减轻学…

redis之如何应对并发访问问题

写在前面 本文一起看下Redis的并发访问控制。 1&#xff1a;单线程的Redis为什么会有并发问题 我们知道&#xff0c;Redis是单线程的&#xff0c;为什么还是会有并发问题呢&#xff1f;没错&#xff0c;如果是单命令操作的话肯定没有并发问题&#xff0c;但考虑事务的场景&a…

nodejs+vue人事管理系统30n9o

开发语言&#xff1a;nodejs 框架&#xff1a;Express 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;VS code 浏览器&#xff1a;谷歌浏览器 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 …

使用VS2019开发调试Android动态库

1. 环境准备 1.1 安装JDK&#xff1a;jdk1.8.0_112 1.2 安装Android SDK SDK可以安装指定的platforms和ndk-bundle。为了兼容性考虑&#xff0c;单独安装了版本比较老的android-ndk-r10b 1.3 安装VS2019 安装VS2019并选择&#xff1a;使用C的移动开发。 1.4 连接开发手机…

基于Java+Mysql实现(web)大型企业管理系统【100010019】

第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作&#xff0c;管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet&#xff0c;JSP&#xff…

spring——Spring自动装配(基于注解)——前提了解——Spring的@Autowired注解为什么用在接口上 (转载)...

大家都知道Service注入的是实现类serviceImpl&#xff0c;那使用时怎么能获取到接口&#xff0c;而且还能调用到实现类的方法。 接口&#xff1a; public interface TestService{ public String test(); }实现类&#xff1a; Service public class TestServiceImpl imp…

Netty_04_消息协议设计与实战(实践类)

文章目录一、前言二、整体运行&#xff1a;先启动服务端&#xff0c;然后启动客户端&#xff0c;发送三条消息三、客户端和服务端3.1 客户端(重要)3.2 服务端(重要)3.3 编码和解码(了解即可)四、尾声一、前言 源码下载&#xff1a;https://www.syjshare.com/res/XEE10LTG 二、…

【Linux修炼】10.进程地址空间

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程地址空间本节目标1. 回顾C/C地址空间1.1 提出问题1.2 见问题产生的现象1.3 解释现象2. 虚拟地址空间2.1 感性理解虚拟地址空间 2.2 如何“画饼”2.3 地址空间的区域划分3. 进程地址空间与内存的关系3.1 虚拟地址和物理…

LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料

LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料 ​ADAM-4056SO是具有12通道自源型携带Modbus协议隔离数字输出模块。具有如下特点&#xff1a; ADO源电源故障检测 输入/输出类型&#xff1a;源式输出 12通道 数字输出&#xff1a;VCC&#xff1a; 1~35伏直流电&a…

基于Java+Mysql实现(WEB)宿舍管理系统【100010016】

数据库实践课程之宿舍管理系统 一、系统需求分析 1.1 系统描述 随着社会的发展以及教育水平的提高&#xff0c;当今社会在校生的数量越来越庞大&#xff0c;使用传统的方式对学生的信息进行管理效率非常低下。在互联网技术高度发达的今天&#xff0c;使用数据库技术对学生的…

Go 实现希尔排序算法及图解

耐心和持久胜过激烈和狂热。 哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的内容是使用 Go 实现希尔排序算法。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本…