hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入
一 在HIVE中创建ETL数据库
->create database etl;
二 在工程目录下新建MysqlToHive.py 和conf文件夹
在conf文件夹下新建如下文件,最后的工程目录如下图

三 源码
Import.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<importtype>
<value>add</value> <!-- 增量导入或者全导入 -->
</importtype> <task type="all">
<table>user_all</table> <!-- 数据库中需要增量导入的第一张表名 -->
<table>oder_all</table> <!-- 数据库中需要增量导入的第一张表名 -->
</task> <task type="add">
<table>user_add</table> <!-- 数据库中需要增量导入的第一张表名 -->
<table>oder_add</table> <!-- 数据库中需要增量导入的第一张表名 -->
</task> </root>
oder_add.xml
<?xml version="1.0" encoding="UTF-8"?> <root>
<sqoop-shell type="import">
<param key="connect">jdbc:mysql://192.168.0.154:3306/db_etl</param> <!-- 数据库连接地址 -->
<param key="username">root</param> <!-- 数据库用户名 -->
<param key="password">123456</param> <!-- 数据库密码 -->
<param key="table">oderinfo</param><!-- 数据库中待导出的表名 -->
<param key="hive-database">etl</param> <!-- 指定导入到HIVE的哪个数据库中 -->
<param key="hive-partition-key">dt</param> <!-- 通过时间分区 -->
<param key="hive-partition-value">$dt</param>
<param key="hive-import"></param>
<param key="check-column">crt_time</param> <!-- 增量导入检查的列 -->
<param key="incremental">lastmodified</param> <!-- 按照时间簇来进行增量导入 -->
<param key="last-value">23:59:59</param> <!-- 增量导入时间划分点 -->
<param key="num-mappers">1</param> <!-- 使用map任务个数 -->
<param key="split-by">id</param> <!-- 将表按照id水平切分交给map处理 -->
</sqoop-shell>
</root>
oder_all.xml
<?xml version="1.0" encoding="UTF-8"?> <root>
<sqoop-shell type="import">
<param key="connect">jdbc:mysql://192.168.0.154:3306/db_etl</param> <!-- 数据库连接地址 -->
<param key="username">root</param><!-- 数据库用户名 -->
<param key="password">123456</param><!-- 数据库密码 -->
<param key="table">oderinfo</param><!-- 数据库中待导出的表名 -->
<param key="hive-database">etl</param> <!-- 指定导入到HIVE的哪个数据库中 -->
<param key="hive-partition-key">dt</param> <!-- 通过时间分区 -->
<param key="hive-partition-value">$dt</param>
<param key="hive-import"></param>
<param key="create-hive-table"></param> <!-- 在hive中新建一张同名同结构的表 -->
<param key="hive-overwrite"></param> <!-- 覆盖原来以存在的表 -->
<param key="num-mappers">1</param> <!-- 使用map任务个数 -->
<param key="split-by">id</param> <!-- 将表按照id水平切分交给map处理 -->
</sqoop-shell>
</root>
user_add.xml
<?xml version="1.0" encoding="UTF-8"?> <root>
<sqoop-shell type="import">
<param key="connect">jdbc:mysql://192.168.0.154:3306/db_etl</param> <!-- 数据库连接地址 -->
<param key="username">root</param> <!-- 数据库用户名 -->
<param key="password">123456</param> <!-- 数据库密码 -->
<param key="table">userinfo</param><!-- 数据库中待导出的表名 -->
<param key="hive-database">etl</param> <!-- 指定导入到HIVE的哪个数据库中 -->
<param key="hive-partition-key">dt</param> <!-- 通过时间分区 -->
<param key="hive-partition-value">$dt</param>
<param key="hive-import"></param>
<param key="check-column">crt_time</param> <!-- 增量导入检查的列 -->
<param key="incremental">lastmodified</param> <!-- 按照时间簇来进行增量导入 -->
<param key="last-value">23:59:59</param> <!-- 增量导入时间划分点 -->
<param key="num-mappers">1</param> <!-- 使用map任务个数 -->
<param key="split-by">id</param> <!-- 将表按照id水平切分交给map处理 -->
</sqoop-shell>
</root>
user_all.xml
<?xml version="1.0" encoding="UTF-8"?> <root>
<sqoop-shell type="import">
<param key="connect">jdbc:mysql://192.168.0.154:3306/db_etl</param> <!-- 数据库连接地址 -->
<param key="username">root</param><!-- 数据库用户名 -->
<param key="password">123456</param><!-- 数据库密码 -->
<param key="table">userinfo</param><!-- 数据库中待导出的表名 -->
<param key="hive-database">etl</param> <!-- 指定导入到HIVE的哪个数据库中 -->
<param key="hive-partition-key">dt</param> <!-- 通过时间分区 -->
<param key="hive-partition-value">$dt</param>
<param key="hive-import"></param>
<param key="create-hive-table"></param> <!-- 在hive中新建一张同名同结构的表 -->
<param key="hive-overwrite"></param> <!-- 覆盖原来以存在的表 -->
<param key="num-mappers">1</param> <!-- 使用map任务个数 -->
<param key="split-by">id</param> <!-- 将表按照id水平切分交给map处理 -->
</sqoop-shell>
</root>
MysqlToHive.py
# _*_ coding:UTF-8 _*_
'''
Created on 2016��12��1�� @author: duking
'''
import datetime
import os
import xml.etree.ElementTree as ET
import collections #获取昨天时间
def getYesterday():
today=datetime.date.today()
oneday=datetime.timedelta(days=1)
yesterday=today-oneday
return yesterday def Resolve_Conf(dt): #获取当前工程目录
PROJECT_DIR = os.getcwd()
#获得配置文件名
conf_file = PROJECT_DIR + "\conf\Import.xml"
#解析配置文件
xml_tree = ET.parse(conf_file) #提取出本次导入的类型 全导入或者增量导入 通过配置import.xml中的plan标签的value值设定
import_types = xml_tree.findall('./importtype')
for import_type in import_types:
aim_types = import_type.findall('./value')
for i in range(len(aim_types)):
aim_type = aim_types[i].text #获得task元素
tasks = xml_tree.findall('./task') #用来保存待执行的sqoop命令的集合
cmds = [] for task in tasks:
#获得导入类型,增量导入或者全量导入
import_type = task.attrib["type"] #如果task的标签导入类型与设定类型不同,结束本次循环
if(import_type != aim_type):
continue #获得表名集合
tables = task.findall('./table') #迭代表名集合,解析表配置文件
for i in range(len(tables)):
#表名
table_name = tables[i].text
#表配置文件名
table_conf_file = PROJECT_DIR + "\conf\\" + table_name + ".xml" #解析表配置文件
xmlTree = ET.parse(table_conf_file) #获取sqoop-shell 节点
sqoopNodes = xmlTree.findall("./sqoop-shell")
#获取sqoop 命令类型
sqoop_cmd_type = sqoopNodes[0].attrib["type"] #首先组装成sqoop命令头
command = "sqoop " + sqoop_cmd_type #获取
praNodes = sqoopNodes[0].findall("./param") #用来保存param的信息的有序字典
cmap = collections.OrderedDict()
#将所有param中的key-value存入字典中
for i in range(len(praNodes)):
#获取key的属性值
key = praNodes[i].attrib["key"]
#获取param标签中的值
value = praNodes[i].text
#保存到字典中
cmap[key] = value #迭代字典将param的信息拼装成字符串
for key in cmap: value = cmap[key] #如果不是键值对形式的命令 或者值为空,跳出此次循环
if(value == None or value == "" or value == " "):
value = "" if(key == "hive-partition-value"):
value = value.replace('$dt',str(dt))
#合成前一天的时间
if(key == "last-value"):
value = '"' + str(dt) + " " + value + '"' #拼装为命令
command += " --" + key + " " + value + " " #将命令加入至待执行的命令集合
cmds.append(command) return cmds #python 模块的入口:main函数
if __name__ == '__main__': dt = getYesterday(); #解析配置文件,生成相应的HQL语句
cmds = Resolve_Conf(dt) #迭代集合,执行命令
for i in range(len(cmds)):
cmd = cmds[i]
print cmd
#执行导入过秤
os.system(cmd)
hadoop项目实战--ETL--(三)实现mysql表到HIVE表的全量导入与增量导入的更多相关文章
- MySQL数据库企业集群项目实战(阶段三)
MySQL数据库企业集群项目实战(阶段三) 作者 刘畅 时间 2020-10-25 目录 1 架构拓扑图 1 1.1 方案一 1 1.2 方案二 2 ...
- Hadoop项目实战-用户行为分析之应用概述(三)
1.概述 本课程的视频教程地址:<项目工程准备> 本节给大家分享的主题如下图所示: 下面我开始为大家分享今天的第三节的内容——<项目工程准备>,接下来开始分享今天的内容. 2. ...
- Hadoop项目实战-用户行为分析之应用概述(二)
1.概述 本课程的视频教程地址:<项目整体概述> 本节给大家分享的主题如下图所示: 下面我开始为大家分享第二节的内容——<项目整体概述>,下面开始今天的分享内容. 2.内容 从 ...
- Selenium Web 自动化 - 项目实战(三)
Selenium Web 自动化 - 项目实战(三) 2016-08-10 目录 1 关键字驱动概述2 框架更改总览3 框架更改详解 3.1 解析新增页面目录 3.2 解析新增测试用例目录 3. ...
- Hadoop项目实战-用户行为分析之应用概述(一)
1.概述 本课程的视频教程地址:<Hadoop 回顾> 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中 ...
- Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面
制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...
- (转载)Android项目实战(三十二):圆角对话框Dialog
Android项目实战(三十二):圆角对话框Dialog 前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...
- mysql的全量备份与增量备份
mysql的全量备份与增量备份 全量备份:可以使用mysqldump直接备份整个库或者是备份其中某一个库或者一个库中的某个表. 备份所有数据库:[root@my ~]# mysqldump -uroo ...
- mysql全量备份与增量备份
mysql全量备份与增量备份 1.全量备份 全量备份就是把数据库中所有的数据进行备份. 备份所有库: mysqldump -uroot -p456 -S /data/3306/mysql.sock ...
随机推荐
- MySQL 5.7怎么爬出暂时表空间的坑
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/n88Lpo/article/details/78126267 导读 怎样确认暂时表是由哪个用户连接创 ...
- 读取Linux上图片
/** * 读取图片 * @param path * @param response * @throws Exception */ public static void showImg(String ...
- springmvc接收参数
springmvc执行流程 搭建ssm框架:http://www.cnblogs.com/liyafei/p/7955413.html 1:从表单中接收 普通请求参数 结构目录 role.html 1 ...
- 【Cocos2dx 3.x Lua】CCParallaxNode使用
我们知道,当我们移动时,我们会看到离我们越近的物体,会移动的越快,越远的物体,比如远处的山会移动的很慢,而最远处的物体,比如太阳几乎不动,这个现象叫视差,而在游戏中模仿视差,可以让玩家感觉到游戏中的角 ...
- [LeetCode] 785. Is Graph Bipartite?_Medium tag: DFS, BFS
Given an undirected graph, return true if and only if it is bipartite. Recall that a graph is bipart ...
- C# 后台动态添加标签(span,div) 以及模板添加
很多时候.我们需要在后台用C#代码添加html标签.而不是在html源码中添加. 比如在html源码中简单的一个input 标签 <input type="type" nam ...
- Leetcode: Repeated DNA Sequence
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- 【Java】系统漏洞:关于用户登录后操作的注意事项
项目背景: SpringMVC + Mybatis + MySql数据库(javaWeb项目开发) 相关模块:登录,个人详细信息修改,订单详情查询 相关漏洞介绍: 1.登录的验证码:登录的验证码一定 ...
- matplotlib显示中文
[注意] 可能与本文主题无关,不过我还是想指出来:使用matplotlib库时,下面两种导入方式是等价的(我指的是等效,当然这个说法可以商榷:) import matplotlib.pyplot as ...
- yii2 restful api——app接口编程实例
<?php namespace common\components; use common\models\Cart; use common\models\User; use Yii; use y ...