一 在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. unity3d之 C# WaitFOrSeconds()

    学习unity3d不久.在使用WaitFOrSeconds()时,遇到了不少麻烦,故记录,以警示后人. 首先介绍C#和javascript 在使用它有非常大的差别. javascript能够直接使用 ...

  2. redhat7下对用户账户的管理

    redhat7对用户帐号的管理主要集中在新建,删除和修改三个动作. 1.新建用户 通过useradd --help,我们得到useradd的详细参数. -d 目录 指定用户主目录,如果此目录不存在,则 ...

  3. 学习Spark2.0中的Structured Streaming(一)

    转载自:http://lxw1234.com/archives/2016/10/772.htm Spark2.0新增了Structured Streaming,它是基于SparkSQL构建的可扩展和容 ...

  4. IP追踪

    cmd里输入:tracert www.baidu.com 上图箭头方框中就是对应公司的总网IP

  5. Andrew Ng-ML-第十章-应用机器学习的建议

    1.如何改进性能不好的学习算法 图1.运用到测试集上效果不佳 当进行一个正则化线性回归时,最小化了代价函数得到参数,但是运用到新的测试集上,发现效果不好,那么如何改进? 1).增加训练集.但是实际上花 ...

  6. 查看mysql主外键信息

    SELECT  *FROMinformation_schema.key_column_usage tWHERE t.constraint_schema = '库名称'AND t.constraint_ ...

  7. APB总线

    APB(Advance Peripheral Bus)是AMBA总线的一部分,从1998年第一版至今共有3个版本. AMBA 2 APB Specfication:定义最基本的信号interface, ...

  8. 《Convolutional Neural Networks for Sentence Classification》 文本分类

    文本分类任务中可以利用CNN来提取句子中类似 n-gram 的关键信息. TextCNN的详细过程原理图见下: keras 代码: def convs_block(data, convs=[3, 3, ...

  9. 将Pytorch模型从CPU转换成GPU

    1. 如何进行迁移 对模型和相应的数据进行.cuda()处理.通过这种方式,我们就可以将内存中的数据复制到GPU的显存中去.从而可以通过GPU来进行运算了. 1.1 判定使用GPU 下载了对应的GPU ...

  10. UVA 475

    /* 通过这题 学会了 两个词组 immediately to the left 是左邻的意思 immediately to the right 这个是右邻的意思 */ #include <io ...