• 原理

以学生课程成绩为例,将实体和实体间的关系都存在MySQL数据库中,实体有学生和课程,分别对应学生信息表studentInfo和课程信息表courseInfo,实体之间的关系为选课及成绩,对应成绩表gradeInfo,这三张表的结构如图所示。

如果还是以三张表的形式存储数据到HBase中并没有任何意义,因为HBase有列族的概念,可以将三张表的数据整合到HBase的一张表中,HBase中表的逻辑结构如图所示。

HBase表将MySQL三张表的数据聚合到一张表中,studentInfo表映射到HBase的StuInfo列族,gradeInfo和courseInfo表信息映射到Grades列族中,使用HBase列族形式将数据整合到一起,查询起来更加方便,同时对出现大量空值的场景,可以节约大量的存储空间。

  • 所需环境

OS:Ubuntu16.04
Python3
Mysql
MongoDB:v3.6

  • 准备:源数据准备以及实验环境配置
  1. 获取数据源
wget http://10.90.3.2/HUP/NoSQL/WinQSB/coursesel.sql

(1)登陆MySQL,建立空数据库

mysql -u root -p

输入密码,默认为“123456”,然后在mysqlshell中创建数据库,如下。

create database coursesel;

(2)导入数据

use coursesel;
source coursesel.sql;

(3)查看数据是否导入

show tables;
  1. 实验运行环境配置

(1)相关库包下载

python3 -m pip install pymysql
python3 -m pip install thrift
python3 -m pip install hbase-thrift

(2)python连接hbase需要使用thrift,且需要将thrift生成的hbase.py和ttypes.py覆盖python hbase库对应的文件。

thrift生成的hbase.py和ttypes.py文件获取方式如下:

wget http://10.90.3.2/HUP/NoSQL/WinQSB/Hbase.py
wget http://10.90.3.2/HUP/NoSQL/WinQSB/ttypes.py

然后使用以下命令,替换hbase库中的这两个文件,使用命令如下:

cp Hbase.py /home/ubuntu/.local/lib/python3.5/site-packages/hbase/Hbase.py
cp ttypes.py /home/ubuntu/.local/lib/python3.5/site-packages/hbase/ttypes.py
  1. 启动hbase以及thrift服务器

(1)启动hadoop

cd /opt/hadoop/sbin/
hadoop namenode -format
./start-all.sh

(2)启动hbase

cd /opt/hbase-1.2.6/bin/
./start-hbase.sh

(3)启动thrift服务器

./hbase-daemon.sh start thrift

一:读取MySQL数据

1.Python连接MySQL需要用到pymysql库包,

import pymysql

如果提示找不到,输入pip3 install pymysql 安装第三方库

2.编写操作MySQL代码

pymysql.connect("localhost", "root", "", "courseSel")

其中第一个参数localhost为本地数据库,如果远程数据库可使用ip:port形式,例如“10.100.9.33:3306”。接下来两个参数分别为连接数据库的用户名和密码,最后一个为用到的具体数据库名。
因为本例中一个学生可能选择了多门课程,所以在插入HBase时,需针对单个学生的所有选课信息进行操作,因此要先从studentInfo表中获取学生的基本信息,代码如下:

cursor.execute("SELECT * FROM studentInfo")stuInfo = cursor.fetchall()

fatchall方法获取查询的结果,返回的sutInfo为list结构,存储多行数据。然后针对每个学生从gradeInfo和courseInfo表中获取课程信息,如下所示:

for row in stuInfo:#根据学号查询该学生所选课程的相关信息sqlCourse = "SELECT courseInfo.课程名,gradeInfo.成绩 " \"FROM studentInfo,courseInfo,GradeInfo " \"WHERE studentInfo.学号=GradeInfo.学号 " \"and courseInfo.课程号=GradeInfo.课程号 and studentInfo.学号='%d'" %(id)cursor1.execute(sqlCourse)courses = cursor1.fetchall()

经过此查询后可以获取每个学生的选课信息和成绩,显示结果如下:
学生信息:(1, ‘张俊’, 20, 1)
选课:((‘大数据导论’, 87), (‘NoSQL原理’, 90), (‘python’, 89))
学生信息:(2, ‘李莉’, 19, 0)
选课:((‘NoSQL原理’, 92), (‘python’, 90))
学生信息:(3, ‘王琦’, 18, 0)
选课:((‘NoSQL原理’, 88), (‘python’, 70))
学生信息:(4, ‘赵岸’, 19, 1)
选课:((‘大数据导论’, 88), (‘python’, 90))

二:插入HBase

1.Python连接HBase需要使用到thrift服务,下载安装并启动后,在python中import相应的库包:

from thrift.transport import TSocketfrom hbase import Hbasefrom hbase.ttypes import *

2.导入需要的库后,进行HBase的连接,以下代码显示了连接HBase数据库以及创建表:

transport = TSocket.TSocket('host', 9090)protocol = TBinaryProtocol.TBinaryProtocol(transport)client = Hbase.Client(protocol)transport.open()

其中Tsocket方法中第一个参数host为HBase服务器地址,9090为HBase启动的默认端口号。

3.使用HBase.Client创建Client对象,连接上HBase后,创建表结构:

#定义列族cf1 = ColumnDescriptor(name='stuInfo')cf2 = ColumnDescriptor(name='Grades')client.createTable('courseGrade', [cf1, cf2])

使用ColumnDescripto方法描述了一个列族,第一个参数为列族名,还可以增加其他参数,比如设置最大保存版本数maxVersions。使用createTable方法创建表,第一个参数为表名,第二个为列族列表。

4.接下来向列族中插入数据,使用mutateRow方法插入一个逻辑行,对应多个列:

#插入HBase courseGrade表的stuInfo列族mutations = [Mutation(column="stuInfo:name", value = name),Mutation(column="stuInfo:age", value = str(age)),Mutation(column="stuInfo:sex", value = str(sex))]client.mutateRow('courseGrade', str(id), mutations)

mutateRow方法第一个参数为文本类型的表名,第二个参数为文本类型的行键,第三个参数为文本类型的列值列表,后面还可以设置json格式的可选属性。同样的方式将学生的选课信息插入Grades列族:

mutations = [Mutation(column="Grades:'%s'"%(courseName), value=str(score))]client.mutateRow('courseGrade', str(id), mutations)

Grades列族中以courseName为列名,成绩score为具体单元格的值。

5.查询数据
获取某个学生所选课程的成绩,以下示例表示获取学号为1的学生的所有选课信息:

client.getRow('courseGrade','1')client.get('courseGrade','1', ‘StuInfo:name’)

get和getRow方法必须设定表名和行键,第一个参数为表名,第二参数为行键,HBase中所有数据类型均为字符型。getRow方法只能获取一个逻辑行的数据,并且必须指定行键,因此如果想根据学生姓名获取学生的选课信息可以使用scan方法:

scan = TScan()
scan.columns =['stuInfo']
afilter = "valueFilter(=,'substring:李莉')"
scan.filterString = afilter
scanner =client.scannerOpenWithScan("courseGrade",scan,None)
result = client.scannerGetList(scanner,4)

附代码

wget http://10.90.3.2/HUP/NoSQL/WinQSB/hbase_py.py

python实现mysql数据导入HBase相关推荐

  1. sqoop将hbase数据导入mysql_Sqoop将mysql数据导入hbase的血与泪

    Sqoop将mysql数据导入hbase的血与泪(整整搞了大半天) 版权声明:本文为yunshuxueyuan原创文章. 如需转载请标明出处: https://my.oschina.net/yunsh ...

  2. python etl工具 sqoop hive_python脚本 用sqoop把mysql数据导入hive

    转:https://blog.csdn.net/wulantian/article/details/53064123 用python把mysql数据库的数据导入到hive中,该过程主要是通过pytho ...

  3. 数据导入HBase最常用的三种方式及实践分析

    要使用Hadoop,数据合并至关重要,HBase应用甚广.一般而言,需要针对不同情景模式将现有的各种类型的数据库或数据文件中的数据转入至HBase中. 常见方式为:1.使用HBase的API中的Put ...

  4. python做mysql数据迁移_Python中MySQL数据迁移到MongoDB脚本的方法

    MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库 ...

  5. python接入excel_使用python将excel数据导入数据库过程详解

    因为需要对数据处理,将excel数据导入到数据库,记录一下过程. 使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt) 直接丢代码,使用python3,注释比较清楚. ...

  6. sqoop把mysql数据导入hive

    环境: 软件 版本 备注 Ubuntu 19.10   sqoop 1.4.7   mysql 8.0.20-0ubuntu0.19.10.1 (Ubuntu)   hadoop 3.1.2   hi ...

  7. mongodb数据导入hbase,spark读取hbase数据分析

    为什么80%的码农都做不了架构师?>>>    使用mavn管理相关依赖包pom.xml <project xmlns="http://maven.apache.or ...

  8. python抓取数据库数据封装成json_用Python将mysql数据导出成json的方法

    1.相关说明 此脚本可以将Mysql的数据导出成Json格式,导出的内容可以进行select查询确定. 数据传入参数有:dbConfigName, selectSql, jsonPath, fileN ...

  9. python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案

    [问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...

  10. mysql数据首次导入hive_sqoop1.4.7环境搭建及mysql数据导入导出到hive

    sqoop文档:http://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_prerequisites 在hive创建表和导入数据时必须添加分隔符, ...

最新文章

  1. python自定义图标_Python-nautilus:添加自定义标志(叠加图标)
  2. Linux用户root登录shell时,linux系统管理-定制root用户的Shell环境
  3. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9
  4. iOS面试用到的知识点和技术点--第二章
  5. JQuery官方学习资料(译):$( document ).ready()
  6. 《笑傲网湖》第五回 状态检测防火墙
  7. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  8. 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
  9. jeecg 查看 页面 父子表 横向滚动条效果 官方被禁用
  10. 静态作用域与动态作用域的区别(转)
  11. RocketMQ核心架构设计思想
  12. cropbox.js 头像裁剪插件
  13. Java经典算法50道题
  14. 德州扑克AI--Programming Poker AI(译)
  15. 我的面试标准:能干活、基础要好、有潜力!
  16. 如何根据MAC地址获取设备厂商
  17. FTP上传失败报错227 Entering Passive Model (222,111,8,111,10,40)
  18. 51单片机dds信号发生器 扫频 c语言,基于DDS正弦信号发生器设计.doc
  19. Java 服务接入 OpenTracing(2) -- Java 项目快速接入 OpenTracing
  20. HTTP 代理原理及实现

热门文章

  1. 学习linux心得,linux学习心得范文
  2. tushare下载股票历史数据
  3. Flash助手推荐广告删除方法
  4. golang 如何通过cron 表达式解析出上一次触发时间
  5. 多智能体强化学习—QMIX
  6. 计算机怎么看网络密码,怎么查看电脑网络连接密码 - 卡饭网
  7. 通过TP-Link路由器WAN口嗅探PPPoE拨号密码-路由器拨号密码破解方法
  8. 黑客帝国 数字雨 屏幕保护程序 linux ubuntu
  9. 土豆视频ipad 5.0 客户端
  10. android 画扇形进度条,css绘制扇形进度条