一 在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表的全量导入与增量导入的更多相关文章

  1. MySQL数据库企业集群项目实战(阶段三)

                              MySQL数据库企业集群项目实战(阶段三) 作者 刘畅 时间 2020-10-25 目录 1 架构拓扑图 1 1.1 方案一 1 1.2 方案二 2 ...

  2. Hadoop项目实战-用户行为分析之应用概述(三)

    1.概述 本课程的视频教程地址:<项目工程准备> 本节给大家分享的主题如下图所示: 下面我开始为大家分享今天的第三节的内容——<项目工程准备>,接下来开始分享今天的内容. 2. ...

  3. Hadoop项目实战-用户行为分析之应用概述(二)

    1.概述 本课程的视频教程地址:<项目整体概述> 本节给大家分享的主题如下图所示: 下面我开始为大家分享第二节的内容——<项目整体概述>,下面开始今天的分享内容. 2.内容 从 ...

  4. Selenium Web 自动化 - 项目实战(三)

    Selenium Web 自动化 - 项目实战(三) 2016-08-10 目录 1 关键字驱动概述2 框架更改总览3 框架更改详解  3.1 解析新增页面目录  3.2 解析新增测试用例目录  3. ...

  5. Hadoop项目实战-用户行为分析之应用概述(一)

    1.概述 本课程的视频教程地址:<Hadoop 回顾> 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中 ...

  6. Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面

    制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...

  7. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

  8. mysql的全量备份与增量备份

    mysql的全量备份与增量备份 全量备份:可以使用mysqldump直接备份整个库或者是备份其中某一个库或者一个库中的某个表. 备份所有数据库:[root@my ~]# mysqldump -uroo ...

  9. mysql全量备份与增量备份

    mysql全量备份与增量备份   1.全量备份 全量备份就是把数据库中所有的数据进行备份. 备份所有库: mysqldump -uroot -p456 -S /data/3306/mysql.sock ...

随机推荐

  1. 因子分析(Factor Analysis)

    原文地址:http://www.cnblogs.com/jerrylead/archive/2011/05/11/2043317.html 1 问题 之前我们考虑的训练数据中样例的个数m都远远大于其特 ...

  2. [lr] 直方图

    直方图基础知识 • 直方图的特征和作用 ▪ 直方图的x轴从左到右代表亮度逐渐增加,即从最暗到最亮:y轴代表某个亮度值下颜色像素的多少(密度). ▪ 直方图由红绿蓝三种颜色组成,分别表示红绿蓝通道:其中 ...

  3. js五星好评2

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. LINQ的左连接、右连接、内连接和Lamda表达式实现Left join

    1.左连接: var LeftJoin = from t1 in l1join t2 in l2on t1.ID equals t2.ID into Joinedt12from t3 in Joine ...

  5. 20154312《网络对抗》Exp2 后门原理与实践

    常见问题快速链接 Handler failed to bind to xxx.xxx.xx.xxx:xxxx 使用Webcam_snap命令提示1411错误,无法正常拍照 常用后门工具实践 Windo ...

  6. 虚拟环境Scrapy安装

    1.进入安装的虚拟环境(安装虚拟环境请参考我的博客“在windows下安装Python虚拟环境”) 2.pip install Scrapy

  7. 借助IDE到处Runnable JAR 的步骤

    1. 选择项目,右键,export,选择Java目录下的Runnable JAR file , next 2. Lanch configuration 中选择启动类 3. Export destina ...

  8. 设置(更改)Mysql 自增ID的起始值

    SELECT * FROM segwords WHERE id>790511 DELETE FROM segwords WHERE id>790511 #下面这句是设置的 ALTER TA ...

  9. 线程属性pthread_attr_t简介

    本文编辑整理自: http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html http://www.ibm.com/deve ...

  10. Oracle提示错误消息ORA-28001: the password has expired

    首先,以SYS DBA身份进入sqlpuls 打开sqlpuls SQL->请输入用户名:sys as sysdba SQL->密码: 登录成功以后查询DBA用户状态 SQL->se ...