IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 26个数据分析案例——第一站:基于Python的HBase冠字号查询系统 -> 正文阅读

[大数据]26个数据分析案例——第一站:基于Python的HBase冠字号查询系统

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 ~]# cd /usr/local/hadoop/sbin/
[root@master sbin]# ./start-all.sh
[root@master sbin]# jps

运行结果为:

在这里插入图片描述
2、切换到HBase安装目录的bin目录,启动HBase服务,命令如下所示。

[root@master sbin]# cd /usr/local/hbase/bin/
[root@master bin]# ./start-hbase.sh
[root@master bin]# jps

运行结果为:
在这里插入图片描述
3、启动HBase的Thrift接口服务器,命令如下所示。

[root@master bin]# ./hbase-daemon.sh start thrift
[root@master bin]# jps

运行结果为:
在这里插入图片描述
4、启动HBase Shell,命令如下所示。

[root@master bin]# ./hbase shell

运行结果为:
在这里插入图片描述
5、通过create命令进行数据库表的创建,并通过list命令进行验证,命令如下所示。

hbase(main):001:0> create 'CrownSize','info'
hbase(main):002:0> list

运行结果为:
在这里插入图片描述
6、打开另一命令窗口,进入Hadoop安装目录的bin目录,将冠字号存储记录数据文件(该文件请自行存放到usr/local/data目录下)上传到HDFS的根目录下并查看根目录内容进行上传验证,命令如下所示。

[root@master ~]# cd /usr/local/hadoop/bin/
[root@master bin]# ./hadoop fs -put /usr/local/data/in_out_details.txt /
[root@master bin]# ./hadoop fs -ls /

运行结果为:
在这里插入图片描述
7、切换目录为HBase安装目录的bin目录,通过org.apache.hadoop.hbase.mapreduce.ImportTsv方法将其导入到CrownSize数据库表中,命令如下所示。

[root@master bin]# cd /usr/local/hbase/bin/
[root@master bin]# ./hbase org.apache.hadoop.hbase.mapreduce.ImportTsv -Dimporttsv.separator="," -Dimporttsv.columns=HBASE_ROW_KEY,info:exist,info:time,info:bank,info:uid CrownSize /in_out_details.txt

运行结果为:

在这里插入图片描述

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 ~]# cd /usr/local/
[root@master local]# vim CrownSize.py
import happybase
connection=happybase.Connection('192.168.0.10',timeout=500000)
connection.open()
table = connection.table(b'CrownSize')
print(table)
[root@master local]# python CrownSize.py

运行结果为:
在这里插入图片描述
2、导入prompt_toolkit模块,通过prompt()方法进行交互式设置,输入操作方式为“方式,0表示取钱,1表示存钱>”,代码如下所示。

[root@master local]# vim CrownSize.py
import prompt_toolkit
type=prompt_toolkit.prompt('方式,0表示取钱,1表示存钱>')
print (type)
[root@master local]# python CrownSize.py
方式,0表示取钱,1表示存钱>0
[root@master local]# python CrownSize.py
方式,0表示取钱,1表示存钱>1

运行结果为:
在这里插入图片描述
3、定义取钱操作函数,之后输入取钱张数,然后根据这个张数从数据库中获取info:exist值为1的数据中的前几条,代码如下所示。

[root@master local]# python CrownSize.py
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)        
#当输出的操作为0时表示取钱操作
if type=='0':
    # 调用getMoney函数
    getMoney()
[root@master local]# python CrownSize.py
方式,0表示取钱,1表示存钱>0
输入取钱张数>2

运行结果为:

在这里插入图片描述
4、获取成功后,将info:exist的值修改为0,也就是说明这张钱已经被取出了,这里通过try错误处理语句进行操作,在进行数据的修改时,当前数据修改成功,则返回取钱成功;如果数据修改出现错误,则返回取钱失败,代码如下所示。

[root@master ~]# vim CrownSize.py
def getMoney():
    num=prompt_toolkit.prompt('输入取钱张数>')
    # 定义过滤器
    filter = "ValueFilter(=,'binary:1')"
    # 查询数据
    CrownSize=table.scan(filter=filter,limit = int(num))
    # 遍历数据
    for key, data in CrownSize:
        try:
            # 将info:exist值修改为0
            table.put(key, {b'info:exist': b'0'})
            print (key,"取钱成功")
        except:
            print (key,"取钱失败")
            getMoney()
#当输出的操作为0时表示取钱操作
if type=='0':
    # 调用getMoney函数
    getMoney()
[root@master local]# python CrownSize.py
方式,0表示取钱,1表示存钱>0
输入取钱张数>2

运行结果为:

在这里插入图片描述
5、存钱操作需要输入冠字号,之后通过该冠字号查看数据,代码如下所示。

[root@master ~]# vim CrownSize.py
def putMoney():
    # 输入冠字号
    number = prompt_toolkit.prompt('冠字号>')
    # 定义过滤器
    filter = "RowFilter( =, 'binary:" + number + "')"
    # 获取数据
    CrownSize = table.scan(filter=filter)
    # 遍历数据
    for key, data in CrownSize:
        print(key,data)
#当输出的操作为1时表示存钱操作
if type=='1':
    # 调用putMoney函数
    putMoney()
[root@master local]# python CrownSize.py 
方式,0表示取钱,1表示存钱>1
冠字号>AAAA0004

运行结果为:
在这里插入图片描述
6、验证该冠字号在数据库中是否存在,如果不存在则说明是假币,如果存在,则获取info:exist列的值并判断是否为0,为0说明这个钱曾经被取出,现在可以存储,如果不为0,说明这个钱存储在银行,也就是说是假币。代码如下所示。

[root@master ~]# vim CrownSize.py
def putMoney():
    # 输入冠字号
    number = prompt_toolkit.prompt('冠字号>')
    # 定义过滤器
    filter = "RowFilter( =, 'binary:" + number + "')"
    # 获取数据
    CrownSize = table.scan(filter=filter)
    count=0
    DoesItExist=0
    # 遍历数据
    for key, data in CrownSize:
        # 获取info:exist的值
        DoesItExist=int(data[b'info:exist'])
        count += 1
        # 判断info:exist的值是否为0
        if DoesItExist == 0:
            try:
                # 如果等于0,则将info:exist的值修改为1
                table.put(key, {b'info:exist': b'1'})
                print ("存钱成功")
            except:
                print ("存钱失败")
                getMoney()
    # 假币判断,如果count=0,则说明数据库中不存在该冠字号
    # 如果DoesItExist=1,说明数据库中存在该冠字号,为存储状态
    if count == 0 or DoesItExist==1:
        print ('这张是假币,请重新输入!')
        putMoney()
#当输出的操作为1时表示存钱操作
if type=='1':
    # 调用putMoney函数
    putMoney()
[root@master local]# python CrownSize.py 
方式,0表示取钱,1表示存钱>1
冠字号>AAAA0002
[root@master local]# python CrownSize.py 
方式,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电影数据分析

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:24:53  更:2021-08-08 11:25:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 15:06:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码