Code前端首页关于Code前端联系我们

例如Python代码实现将学生课程成绩的mysql数据导入HBase

terry 2年前 (2023-09-25) 阅读数 55 #后端开发

。实体和实体之间的关系存储在MySQL数据库中。实体包括学生和课程,分别对应于学生信息表 StudentInfo 和课程信息表 courseInfo 。实体之间的关系是gradeInfo成绩表对应的选课和成绩。这三个表的结构如图所示。

python代码实现mysql数据导入HBase

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

python代码实现mysql数据导入HBase

HBase表将三个MySQL表的数据聚合到一张表中。 StudentInfo 表分配给 HBase StuInfo 列族。 GradeInfo 和 courseInfo 表信息映射到 Grades 列族。使用HBase列族形式集成数据。查询起来比较方便,同时在显示大量空值的情况下可以节省大量的存储空间。 ? 6”,然后在mysqlshell中创建数据库如下。

create database coursesel;

(2)导入数据

use coursesel;
source coursesel.sql;

(3)检查数据是否导入

showtables;
  1. 实验运行时配置

(1)相关目录下载包

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

(2)需要Thrift连接python和hbase,转换thrift生成的文件并覆盖python的hbase目录对应的文件,将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)启动 start hbase (3)启动 thrift 服务器

./hbase-daemon.sh start thrift

一:读取 MySQL 数据

1.Python 必须使用 pymysql 库包连接MySQL

import pymysql

如果没有找到提示,输入pipql命令安装mys第三方库

2.输入代码让MySQL工作

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

localhost第一个参数是本地数据库。如果远程数据库可以使用ip:port格式,例如“:3306”。接下来的两个参数是连接数据库所需的用户名和密码,最后一个是使用的具体数据库名称。
由于本例中的学生可能选择了多门课程,因此在插入 HBase 时必须处理单个学生的所有选课信息。因此,首先要从studentInfo表中获取学生的基本信息。代码如下:

cursor.execute("SELECT * FROM studentInfo")

stuInfo = cursor.fetchall()

catchall 方法检索查询的结果。返回的sutInfo是一个列表结构,存储了多行数据。然后,对于每个学生,从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))

2:插入HBase

1. Python必须使用thrifty服务来连接HBase。下载安装运行后,将相应的库包导入到python中:

from thrift.transport import TSocket

from hbase import Hbase

from 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。使用Create Client对象,连接到HBase,并创建表结构:



cf1 = ColumnDescriptor(name='stuInfo')

cf2 = ColumnDescriptor(name='Grades')

client.createTable('courseGrade',[cf1, cf2])

使用ColumnDescripto方法描述列族。第一个参数是列族的名称。您还可以添加其他参数,例如设置要保存的最大版本数 maxVersions。使用createTable方法创建表。第一个参数是表的名称,第二个参数是列族列表。

4。然后向列族中插入数据,使用muteRow方法插入多列对应的逻辑行:



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)

muteRow方法的第一个参数是文本类型表的名称,第二个参数是行键。从文本类型。三个参数是文本类型的列值列表,后面可以设置json格式的可选属性。以相同的方式将学生的课程选择数据插入到“班级”列族中:

mutations =[Mutation(column="Grades:'%s'"%(courseName), value=str(score))]

client.mutateRow('courseGrade',str(id), mutations)

在“班级”列族中,courseName 是列的名称,grade 是给定单元格的值。

5。查询数据
检索学生所选课程的成绩。以下示例显示如何检索学生 #1 的课程选择信息:

client.getRow('courseGrade','1')

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

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

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

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门