26个数据分析案例——第一站:基于Python的HBase冠字号查询系统
实验所需环境
? Python: Python 3.x; ? Hadoop 2.7.7环境; ? HBase 1.3.5;
实验背景
针对于人民币的真假识别,最传统的方式就是一看、二摸、三听、四测四种方式,但随着不法分子仿制水平的提高,可能会通过一些技术手段欺骗我们,针对于这种情况我们可以建立一套针对于冠字号管理查询系统进行识别,以唯一的冠字号查询手段,检验真假,冠字号钞票的唯一编号,全世界仅有一个,如果有一个大表可以把所有的人民币以及人民币对应的操作(在什么时间、什么地点存入或获取)记录下来,这样在进行存取时就可以根据冠字号先查询一下,看当前冠字号对应的纸币在大表中的保存的情况,这样就可以确定当前冠字号对应的纸币是否是伪钞。
数据说明
该数据集是冠字号存储记录,用于记录当前人民币的状态,当冠字号处于存储状态时,表示人民币存在银行,反之则表示不存在银行。数据集包含5个字段,其含义如下: ? 第一列:冠字号。 ? 第二列:冠字号是否存在,0表示不存在,1表示存在。 ? 第三列:存储或取出时间。 ? 第四列:所在银行编号。 ? 第五列:用户id。
必备知识
1、数据定义指令
HBase中,数据定义指令也可称为数据定义语言,英文名称为“Data Definition Language”,简称“DDL”,主要用于在HBase Shell中进行HBase数据库结构的操作,如:表的创建、表的查询、表详细信息的查看、表的修改等。HBase Shell中常用数据定义命令如下表所示。
命令 | 描述 |
---|
create | 创建表 | list | 列出HBase中存在的所有表 | describe | 显示表相关的详细信息 | alter | 修改列族(Column Family)模式 | disable | 使表无效 | enable | 使表有效 | is_enabled | 判断表是否有效 | drop | 删除表 | exists | 测试表是否存在 |
2、数据操作指令
数据操作指令也可称为数据操作语言,英文名称为“Data Manipulation Language”,简称“DML”,主要用于在HBase Shell中进行HBase数据表中数据的操作,如:数据的查询、插入、删除和修改等。HBase Shell中常用数据操作命令如下表所示。
命令 | 描述 |
---|
put | 向指定的表单元添加值 | scan | 通过对标的扫描过去对应值 | get | 获取行或单元(cell)的值 | delete | 删除指定对象的值 | deleteall | 删除指定行的所有元素值 | truncate | 清空表 | count | 统计表中的行数 | incr | 添加指定表,行或列的值 |
3、HBase Shell过滤器
(1)比较操作符
比较运算符主要用于判断哪些数据是符合的,哪些数据是被排除的,可以帮助用户实现一段子集或一些特定数据的筛选,如:获取时间戳大于1的数据、获取数值小于10的数据等,HBase中常用的比较操作符如下表所示。
比较操作符 | 描述 |
---|
< | 小于 | <= | 小于等于 | = | 等于 | != | 不等于 | >= | 大于等于 | > | 大于 |
(2)比较器
比较器,即Comparator,代表具体的比较逻辑,如:转换为字节或字符串进行比较并获取数据,HBase中常用的比较器如下表所示。
比较器 | 描述 |
---|
binary | 使用Bytes.compareTo(byte[])比较当前值与阀值 | binaryPrefix | 使用Bytes.compareTo(byte[])进行匹配,从左端开始前缀匹配 | null | 不做匹配,只判断当前值是不是空 | bit | 通过BitwiseOp类提供的按位与(AND)、或(OR)、异或(XOR)操作执行比较 | regexString | 根据一个正则表达式,在实例化这个比较器的时候去匹配表中的数据 | substring | 将阀值和表中数据当作String实例,同时通过contains()操作匹配字符串 |
通过比较操作符合比较器的配合使用,即可定义HBase数据过滤的条件,但需要注意的是,bit、regexString、substring三种比较器只能和等于和不等于运算符搭配使用。
(3)逻辑操作符
在使用过滤器提取数据时,除了使用比较操作符和比较器定义过滤条件外,当需要设置多个过滤条件时,可以通过逻辑操作符,将两个不同的条件连接起来,形成一个新的条件,如:a大于b和a大于c两个条件,通过逻辑操作符的使用可以生成一个a大于b并且a大于c的条件,HBase中常用的逻辑操作符如下表所示。
逻辑操作符 | 描述 |
---|
AND | 与关系,需要满足所有条件 | OR | 或关系,需要满足其中一个条件 |
(4)过滤器
在HBase中,可以将过滤器看作获取数据时设置过滤条件的方法,之后将比较操作符、比较器定义的过滤条件作为过滤器的参数。目前,HBase提供了多种过滤器,可以实现任意情况的过滤的操作,如匹配行键中大于0001的数据、匹配列前缀为li的数据等,常用的过滤器如下表所示。
过滤器 | 名称 |
---|
RowFilter | 行过滤器 | PrefixFilter | 行前缀过滤器 | FamilyFilter | 列族过滤器 | QualifierFilter | 列过滤器 | ColumnPrefixFilter | 列前缀匹配过滤器 | MultipleColumnPrefixFilter | 列多前缀匹配过滤器 | ValueFilter | 单元值过滤器 | SingleColumnValueFilter | 单列值过滤器 | ColumnCountGetFilter | 列数过滤器 | TimestampsFilter | 时间戳过滤器 |
过滤器使用的语法格式如下所示。
scan '表名',{FILTER=>"过滤器(比较运算符,'比较器') 逻辑操作符 过滤器1(比较运算符,'比较器')"}
其中,“FILTER=>”主要用于指明过滤的方法,整体可用大括号引用,也可以不用大括号。过滤的方法用双引号引用,而比较方式用小括号引用。
4、HBase Python API
(1)创建客户端与HBase的连接
Python使用HappyBase模块连接HBase需要通过“happybase.Connection()”方法实现,语法格式如下所示。
connection=happybase.Connection(host,port,timeout,autoconnect,table_prefix, table_prefix_separator, compat, transport, protocol)
上述语法中connection为连接对象,参数说明如下表所示。
参数 | 说明 |
---|
host | 主机名,默认为localhost | port | 端口 | timeout | 超时时间,单位为毫秒 | autoconnect | 连接是否直接打开,默认为True,直接进行连接,当为False时,Connection.open()方法在首次使用前必须明确调用 | table_prefix | 用于构造表名的前缀,例如:table_prefix是myproject,则所有的表格都会有类似“myproject_XYZ”的名字 | table_prefix_separator | 用于table_prefix的分隔符 | compat | 设置此连接的兼容级别 | transport | 指定要使用Thrift的传输模式,值为buffered默认值和framed | protocol | 指定要使用Thrift的传输协议,值为binary默认值和compact |
连接对象创建完成后还需要使用open()方法开启传输,在操作完成后并使用close()关闭传输,方法如下所示。
connection.open() //开启传输
connection.close() //关闭传输
(2)表操作
HappyBase表操作方法主要是针对于HBase中的表结构和信息的操作,如创建、删除、查看信息、禁用和启用表等。表操作方法如下表所示。
方法 | 作用 |
---|
create_table() | 创建一个表 | tables() | 查看所有数据表名称 | table() | 返回一个表格对象 | disable_table(name) | 禁用指定的表 | enable_table(name) | 启用指定的表 | is_table_enabled(name) | 查看表是否启用 | delete_table() | 删除指定的表格 |
(3)表数据操作
对表中的列族、列、单元等内容进行操作的方法归类为表数据操作方法,主要包含查看列族信息、插入数据、删除数据等,在执行此类方法之前需要获取happybase.table对象,获取方法如下。
table= connection.table(name, use_prefix=True/False)
HappyBase库中常用的HBase表内容操作方法如下表所示。
方法 | 作用 |
---|
families() | 获取列族信息 | put() | 将数据存储在表中 | row() | 检索一行数据 | rows() | 检索多行数据 | scan() | 表中的数据创建一个扫描器 | delete() | 从表中删除数据 |
(4)HappyBase中的过滤器
Happybase中的过滤器使用方法与HBase Shell中类似,需要将过滤器规则以字符串的形式添加到scan中,语法如下所示。
filter="过滤器"
table.scan(filter=filter)
5、数据导入
在项目中,面对大批量的数据,一个一个去手动录入是不现实的,因此为了提高数据的添加的效率,HBase的hbase脚本提供了一个org.apache.hadoop.hbase.mapreduce.ImportTsv方法可以将HDFS中的数据文件中的数据导入至HBase数据库,这个数据文件可以是文本文件、CSV文件等。语法格式如下所示。
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator=',' -Dimporttsv.columns=a,b,c tablename hdfsfile
参数说明如下: ? -Dimporttsv.separator:分隔符。 ? -Dimporttsv.columns:列族及列名称,当需要将第一列数据作为行键,需要将-Dimporttsv.columns参数的第一个值设置为“HBASE_ROW_KEY”。 ? tablename:表名称,需要事先在HBase中创建。 ? hdfsfile:数据文件在HDFS上的路径。
资料包
链接:https://pan.baidu.com/s/1e2US27bpCY2GkJwIhXujXg
提取码:o7h8
实验步骤
第一步:准备数据
1、打开命令窗口,进入Hadoop安装目录的sbin目录,启动Hadoop相关服务,命令如下所示。
[root@master ~]
[root@master sbin]
[root@master sbin]
运行结果为:
 2、切换到HBase安装目录的bin目录,启动HBase服务,命令如下所示。
[root@master sbin]
[root@master bin]
[root@master bin]
运行结果为:  3、启动HBase的Thrift接口服务器,命令如下所示。
[root@master bin]
[root@master bin]
运行结果为:  4、启动HBase Shell,命令如下所示。
[root@master bin]
运行结果为:  5、通过create命令进行数据库表的创建,并通过list命令进行验证,命令如下所示。
hbase(main):001:0> create 'CrownSize','info'
hbase(main):002:0> list
运行结果为:  6、打开另一命令窗口,进入Hadoop安装目录的bin目录,将冠字号存储记录数据文件(该文件请自行存放到usr/local/data目录下)上传到HDFS的根目录下并查看根目录内容进行上传验证,命令如下所示。
[root@master ~]
[root@master bin]
[root@master bin]
运行结果为:  7、切换目录为HBase安装目录的bin目录,通过org.apache.hadoop.hbase.mapreduce.ImportTsv方法将其导入到CrownSize数据库表中,命令如下所示。
[root@master bin]
[root@master bin]
运行结果为:

8、切换到HBase Shell命令窗口,通过scan命令查看数据库表CrownSize的前三行数据,验证数据是否导入成功,命令如下所示。
hbase(main):003:0> scan 'CrownSize',{LIMIT=>3}
运行结果为: 
第二步:冠字号查询系统创建
1、再次打开命令窗口,进入/usr/local目录下,创建Python文件并编写代码,导入操作HBase的Python API,连接HBase服务后连接HBase的CrownSize数据表,代码如下所示。
[root@master ~]
[root@master local]
import happybase
connection=happybase.Connection('192.168.0.10',timeout=500000)
connection.open()
table = connection.table(b'CrownSize')
print(table)
[root@master local]
运行结果为:  2、导入prompt_toolkit模块,通过prompt()方法进行交互式设置,输入操作方式为“方式,0表示取钱,1表示存钱>”,代码如下所示。
[root@master local]
import prompt_toolkit
type=prompt_toolkit.prompt('方式,0表示取钱,1表示存钱>')
print (type)
[root@master local]
方式,0表示取钱,1表示存钱>0
[root@master local]
方式,0表示取钱,1表示存钱>1
运行结果为:  3、定义取钱操作函数,之后输入取钱张数,然后根据这个张数从数据库中获取info:exist值为1的数据中的前几条,代码如下所示。
[root@master local]
def getMoney():
num=prompt_toolkit.prompt('输入取钱张数>')
filter = "ValueFilter(=,'binary:1')"
CrownSize=table.scan(filter=filter,limit = int(num))
for key, data in CrownSize:
print(key,data)
if type=='0':
getMoney()
[root@master local]
方式,0表示取钱,1表示存钱>0
输入取钱张数>2
运行结果为:
 4、获取成功后,将info:exist的值修改为0,也就是说明这张钱已经被取出了,这里通过try错误处理语句进行操作,在进行数据的修改时,当前数据修改成功,则返回取钱成功;如果数据修改出现错误,则返回取钱失败,代码如下所示。
[root@master ~]
def getMoney():
num=prompt_toolkit.prompt('输入取钱张数>')
filter = "ValueFilter(=,'binary:1')"
CrownSize=table.scan(filter=filter,limit = int(num))
for key, data in CrownSize:
try:
table.put(key, {b'info:exist': b'0'})
print (key,"取钱成功")
except:
print (key,"取钱失败")
getMoney()
if type=='0':
getMoney()
[root@master local]
方式,0表示取钱,1表示存钱>0
输入取钱张数>2
运行结果为:
 5、存钱操作需要输入冠字号,之后通过该冠字号查看数据,代码如下所示。
[root@master ~]
def putMoney():
number = prompt_toolkit.prompt('冠字号>')
filter = "RowFilter( =, 'binary:" + number + "')"
CrownSize = table.scan(filter=filter)
for key, data in CrownSize:
print(key,data)
if type=='1':
putMoney()
[root@master local]
方式,0表示取钱,1表示存钱>1
冠字号>AAAA0004
运行结果为:  6、验证该冠字号在数据库中是否存在,如果不存在则说明是假币,如果存在,则获取info:exist列的值并判断是否为0,为0说明这个钱曾经被取出,现在可以存储,如果不为0,说明这个钱存储在银行,也就是说是假币。代码如下所示。
[root@master ~]
def putMoney():
number = prompt_toolkit.prompt('冠字号>')
filter = "RowFilter( =, 'binary:" + number + "')"
CrownSize = table.scan(filter=filter)
count=0
DoesItExist=0
for key, data in CrownSize:
DoesItExist=int(data[b'info:exist'])
count += 1
if DoesItExist == 0:
try:
table.put(key, {b'info:exist': b'1'})
print ("存钱成功")
except:
print ("存钱失败")
getMoney()
if count == 0 or DoesItExist==1:
print ('这张是假币,请重新输入!')
putMoney()
if type=='1':
putMoney()
[root@master local]
方式,0表示取钱,1表示存钱>1
冠字号>AAAA0002
[root@master local]
方式,0表示取钱,1表示存钱>1
冠字号>AAAA0003
运行结果为: 
后续案例持续更新
01 冠字号查询系统 02民航客户价值分析 03 药店销售数据分析 04浏览器流量访问离线日志采集并处理 05 慕课网数据采集并处理 06 Linux操作系统实时日志采集并处理 07 医疗行业案例-中医病症辩证关联规则分析 08教育行业案例-高校学生生活数据分析 10 娱乐行业案例-广告收益回归预测模型 11网络行业案例-网站访问行为分析 12零售行业案例-店铺热门商品实时统计 13 营业额数据可视化 14金融行业案例-基于上市公司股票信息及其衍生变量的金融数据分析 15银行信用卡风险数据可视化 16 滴滴出行城市运营分析 17 幸福指数可视化 18 员工主动离职预警模型 19 歌手推荐模型 20 2020新冠肺炎疫情数据分析 21 淘宝购物狂欢节数据分析 22 共享单车数据分析 23人脸检测系统 24服装分拣系统 25口罩佩戴识别系统 26 imdb电影数据分析
|