Python读取hbase数据库

1. hbase连接

首先用hbase shell 命令来进入到hbase数据库,然后用list命令来查看hbase下所有表,以其中表"DB_level0"为例,可以看到库名"baotouyiqi"是拼接的,python代码访问时先连接:

python 复制代码
def hbase_connection(hbase_master, hbase_port, table_prefix=None):
    connection = happybase.Connection(host=hbase_master, port=hbase_port, table_prefix=table_prefix)
    return connection
connection = hbase_connection(hbase_master, hbase_port, table_prefix)  # 在连接的时候创建项目空间
table = connection.table(tablename)  # 获取表连接

备注:完整代码在最后,想运行的直接滑倒最后复制即可

2. 按条件读取hbase数据

然后按照条件来查询表中想要的数据集,这里只列举两个条件:时间区间和指定列。同样,我们在shell下用scan命令来查看表中的数据结构:

可以看到第一列是ROW,第二列是COLUMN+CELL,python代码取数据方法差不多:

python 复制代码
date_prex_start = bytes('dt_' + starttime, encoding='utf-8')  # row_start
date_prex_end = bytes('dt_' + endtime, encoding='utf-8')  # row_stop
# 通过设置row key的前缀row_prefix参数来进行局部扫描
outdata = dict(table.scan(row_start=date_prex_start, row_stop=date_prex_end,
                          columns=[onecolumn]))

得到的结果如下,是个字典格式:

3. 按格式输出hbase数据结果

我们希望输出的结果是dataframe的,而且第一列是time,第二列是value,所以就做个简单格式处理:

python 复制代码
timesep = list(map(lambda x: x.decode('utf-8').replace('dt_', ''), outdata.keys()))
tempdata = list(outdata.values())
valuelist = list(map(lambda x: float(list(x.values())[0]), tempdata))
if len(timesep) > 0:
    db_data2 = pd.DataFrame({'时间': timesep, onecolumn: valuelist})
    db_data2.loc[:, '时间2'] = [i[:16] for i in db_data2['时间']]
    db_data2 = db_data2.drop_duplicates(subset=['时间2'], keep='last')  # 一分钟内多次数值取一个即可
else:
    db_data2 = pd.DataFrame()
if len(db_data2) < 1:
    return pd.DataFrame()
db_data2.loc[:, '时间戳'] = [time.mktime(time.strptime(i, "%Y-%m-%d %H:%M:%S")) for i in db_data2['时间']]
db_data2 = db_data2.sort_values(by=['时间戳'], ascending=False)  # 将最新的数值放最前面
db_data3 = db_data2.drop(columns=['时间2', '时间戳'])
db_data3.columns = ['time', 'value']

4. 完整代码(code)

python 复制代码
import happybase
import time
import pandas as pd
from pathlib import Path

os_file_name = Path(__file__).name


def hbase_connection(hbase_master, hbase_port, table_prefix=None):
    connection = happybase.Connection(host=hbase_master, port=hbase_port, table_prefix=table_prefix)
    return connection


def get_data_by_tum(hbase_master, hbase_port, table_prefix, tablename, columnslist, starttime, endtime):
    columnsid = '$'.join(columnslist)
    onecolumn = 'TimeSe:dt_' + columnsid  # column

    connection = hbase_connection(hbase_master, hbase_port, table_prefix)  # 在连接的时候创建项目空间
    table = connection.table(tablename)  # 获取表连接
    date_prex_start = bytes('dt_' + starttime, encoding='utf-8')  # row_start
    date_prex_end = bytes('dt_' + endtime, encoding='utf-8')  # row_stop
    # 通过设置row key的前缀row_prefix参数来进行局部扫描
    outdata = dict(table.scan(row_start=date_prex_start, row_stop=date_prex_end,
                              columns=[onecolumn]))

    timesep = list(map(lambda x: x.decode('utf-8').replace('dt_', ''), outdata.keys()))
    tempdata = list(outdata.values())
    valuelist = list(map(lambda x: float(list(x.values())[0]), tempdata))
    if len(timesep) > 0:
        db_data2 = pd.DataFrame({'时间': timesep, onecolumn: valuelist})
        db_data2.loc[:, '时间2'] = [i[:16] for i in db_data2['时间']]
        db_data2 = db_data2.drop_duplicates(subset=['时间2'], keep='last')  # 一分钟内多次数值取一个即可
    else:
        db_data2 = pd.DataFrame()
    if len(db_data2) < 1:
        return pd.DataFrame()
    db_data2.loc[:, '时间戳'] = [time.mktime(time.strptime(i, "%Y-%m-%d %H:%M:%S")) for i in db_data2['时间']]
    db_data2 = db_data2.sort_values(by=['时间戳'], ascending=False)  # 将最新的数值放最前面
    db_data3 = db_data2.drop(columns=['时间2', '时间戳'])
    db_data3.columns = ['time', 'value']
    return db_data3


if __name__ == '__main__':
    begin_time = '2023-08-22 00:00:00'
    end_time = '2023-08-23 00:00:00'
    hbase_master = "142.21.8.22"
    hbase_port = 9097
    table_prefix = "baotouyiqi"
    table_name = "DB_level0"
    onedata = ["62340", "20", "204"]
    dataget = get_data_by_tum(hbase_master, hbase_port, table_prefix, table_name,
                              onedata, begin_time, end_time)
    print(dataget)
相关推荐
喵叔哟37 分钟前
6.配置管理详解
后端·python·flask
曾经的三心草40 分钟前
基于正倒排索引的Java文档搜索引擎3-实现Index类-实现搜索模块-实现DocSearcher类
java·python·搜索引擎
MOMO陌染1 小时前
Python 饼图入门:3 行代码展示数据占比
后端·python
vvoennvv2 小时前
【Python TensorFlow】 TCN-GRU时间序列卷积门控循环神经网络时序预测算法(附代码)
python·rnn·神经网络·机器学习·gru·tensorflow·tcn
自学互联网2 小时前
使用Python构建钢铁行业生产监控系统:从理论到实践
开发语言·python
无心水3 小时前
【Python实战进阶】7、Python条件与循环实战详解:从基础语法到高级技巧
android·java·python·python列表推导式·python条件语句·python循环语句·python实战案例
xwill*3 小时前
RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION
人工智能·pytorch·python·深度学习
陈奕昆3 小时前
n8n实战营Day2课时2:Loop+Merge节点进阶·Excel批量校验实操
人工智能·python·excel·n8n
程序猿追3 小时前
PyTorch算子模板库技术解读:无缝衔接PyTorch模型与Ascend硬件的桥梁
人工智能·pytorch·python·深度学习·机器学习
秋邱3 小时前
高等教育 AI 智能体的 “导学诊践” 闭环
开发语言·网络·数据库·人工智能·python·docker