Python使用happybase写入HBase

这篇具有很好参考价值的文章主要介绍了Python使用happybase写入HBase。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

HBase是一个分布式的、面向列的NoSQL数据库,可以存储大量的非结构化或半结构化的数据。tif是一种常见的影像文件格式,可以存储多波段的栅格数据。本文将介绍如何使用Python的happybase模块和gdal模块,从tif格式的影像文件中读取数据,并将其存储到HBase数据库中。

主要内容包括:

  • 准备工作:安装Python环境,安装happybase模块和gdal模块,安装HBase数据库,并准备tif影像文件。
  • 读取tif影像数据:使用readTif函数读取tif影像数据集,并获取其宽度、高度、波段数、数据数组、仿射变换参数和投影信息。遍历tif影像文件所在的文件夹,获取tif影像文件的日期和分块信息。
  • 写入HBase数据库:创建一个happybase连接对象,并获取或创建一个happybase表对象。遍历每个分块,使用readTif函数读取每个分块的每个日期的每个波段的数据,并将其存储到一个三维的numpy数组中。遍历每个像素,将其对应的每个波段的每个日期的数据组合成一个字典,作为HBase表中的列值。使用分块编号、行号和列号拼接成一个字符串,作为HBase表中的行键。使用put方法将行键和列值写入HBase表中。关闭happybase连接对象。

一、准备工作

  • 安装Python环境,本文使用的是Anaconda3。
  • 安装happybase模块,可以使用pip或conda命令。例如:
pip install happybase
  • 安装gdal模块,可以使用pip或conda命令。例如:
conda install gdal
  • 启动分布式集群,hadoop以及hbase;启动thrift服务,可以使用hbase-daemon.sh脚本。例如:
hbase-daemon.sh start thrift

就可以使用happybase模块连接到thrift服务,并操作HBase数据库了

  • 准备tif格式的影像文件,并放在一个文件夹中。本文使用的是Sentinel-2卫星的10个波段的影像数据,分为多个日期和多个分块。

二、读取tif影像数据

  • 导入需要的模块,包括time、happybase、gdal、numpy、pandas、os和tqdm。例如:
import time
import happybase
from osgeo import gdal
import numpy as np
import pandas as pd
import os
from tqdm import tqdm
  • 定义一个函数readTif,用于读取tif格式的影像数据集,并返回其宽度、高度、波段数、数据数组、仿射变换参数和投影信息。例如:
#  读取tif数据集
def readTif(fileName, xoff=0, yoff=0, data_width=0, data_height=0):
    dataset = gdal.Open(fileName)
    num_bands = dataset.RasterCount
    # print(num_bands)
    if dataset == None:
        print(fileName + "文件无法打开")
    #  栅格矩阵的列数
    width = dataset.RasterXSize
    #  栅格矩阵的行数
    height = dataset.RasterYSize
    #  波段数
    bands = dataset.RasterCount
    #  获取数据
    if (data_width == 0 and data_height == 0):
        data_width = width
        data_height = height
    data = dataset.ReadAsArray(xoff, yoff, data_width, data_height)
    #  获取仿射矩阵信息
    geotrans = dataset.GetGeoTransform()
    #  获取投影信息
    proj = dataset.GetProjection()
    return width, height, bands, data, geotrans, proj
  • 获取tif影像文件所在的文件夹路径,并遍历该文件夹下所有以.tif为后缀名的文件。例如:
# 分块影像所在文件夹,不能有中文
tifDir = r"E:\pyimg\tif2csv\S2SR10mallband3tile"
tifs = [i for i in os.listdir(tifDir) if i.endswith(".tif")]
print("有 %s 个tif文件" % len(tifs))

happybase python,分布式存储与并行处理,hbase,数据库,分布式,python

  •  获取tif影像文件的日期和分块信息,并去重排序。例如:
# 获取目标文件数量,前缀相同的
bandlist=['B2','B3','B4','B5','B6','B7','B8','B8A','B11','B12']
datelist1 = []
fenkuailist1 = []
for i in tifs:
    datelist1.append(i[:-26])
    fenkuailist1.append(i[-25:-4])

datelist = list(set(datelist1))
datelist.sort(key=datelist1.index)
fenkuailist = list(set(fenkuailist1))
fenkuailist.sort(key=fenkuailist1.index)
print("有 %s 个日期" % len(datelist))
print("datelist" , datelist)
print("每个日期 %s 个块" % len(fenkuailist))
print("fenkuailist" , fenkuailist)

三、写入HBase数据库

  • 创建一个happybase连接对象,并指定HBase数据库的IP地址。例如:
connection = happybase.Connection('192.168.1.100')
# # before first use:
connection.open()
  • 获取或创建一个happybase表对象,并指定表名和列族名。例如:
table = connection.table('rawdata')
  • 遍历每个分块,使用readTif函数读取每个分块的每个日期的每个波段的数据,并将其存储到一个三维的numpy数组中。例如:
#len(fenkuailist)
for kuai in range(1):
    print("(%d/%d)块编号:"%(kuai+1,len(fenkuailist)),fenkuailist[kuai])
    # 初始化立方体
    img_file = tifDir + "\\" + datelist[0] + "-" + fenkuailist[kuai] + ".tif"
    im_width, im_height, im_bands, im_data, kuai_im_geotrans, kuai_im_proj = readTif(img_file)

    tmpttt = np.empty((im_bands, im_width * im_height, len(datelist)))
    # print("波段 %s 个" % im_bands)
    # print("行列数", im_width, im_height)
#len(datelist)
    for shijian in range(len(datelist)):
        #  图像
        img_file = tifDir + "\\" + datelist[shijian] + "-" + fenkuailist[kuai] + ".tif"
        # print(img_file)
        im_width, im_height, im_bands, im_data, im_geotrans, im_proj = readTif(img_file)
        kuai_im_geotrans = im_geotrans
        kuai_im_proj=im_proj

        for j in range(im_bands):
            # print("jjjjjjjjjjjjjjjjjjjjj",im_data[j].flatten(order = 'C'))
            tmpttt[j, :, shijian] = im_data[j].flatten(order='C')
  • 遍历每个像素,将其对应的每个波段的每个日期的数据组合成一个字典,作为HBase表中的列值。使用分块编号、行号和列号拼接成一个字符串,作为HBase表中的行键。使用put方法将行键和列值写入HBase表中。例如:
    print("写入中...")

    print(tmpttt[1, 1, :])

    #im_width * im_height
    for index in tqdm(range(im_width * im_height)):
        dt={}
        for ban in range(im_bands):
            d1=zip(map(lambda  x:"f1:"+x+bandlist[ban],datelist),tmpttt[ban, index, :].astype(str))
            # Converting zip object to dict using dict() contructor.
            dt.update(d1)
        # print (dict(dt)) 
        key=str(kuai%3)+fenkuailist[kuai][6:10]+fenkuailist[kuai][-4:]+str(index)
        # print(key)
        table.put(key, dt)  # 提交数据,0001代表行键,写入的数据要使用字典形式表示
  • 关闭happybase连接对象。例如:
connection.close()  # 关闭传输

happybase python,分布式存储与并行处理,hbase,数据库,分布式,python

四、数据验证

写入的表rawdata经过预分区,所以写入后数据较为均衡的分布在各个节点 

happybase python,分布式存储与并行处理,hbase,数据库,分布式,python

  • count命令

hbase shell中

count "rawdata"

happybase python,分布式存储与并行处理,hbase,数据库,分布式,python

  • 调用Mapreduce

具体内容根据环境配置调整

c914@hadoop100:/usr/local/hbase/bin$ ./hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'rawdata'

happybase python,分布式存储与并行处理,hbase,数据库,分布式,python文章来源地址https://www.toymoban.com/news/detail-569152.html

到了这里,关于Python使用happybase写入HBase的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 3 使用 write()、writelines() 函数写入文件

    1 使用 write() 函数,将字符串(或字节串,仅适用写入二进制文件中)写入文件中。 2 使用 writelines() 函数,将字符串列表写入文件中。 附录: mode参数  r 默认以只读方式打开文件。文件的指针将会放在文件的开头。 rb 以二进制格式打开一个文件用于只读。文件指针将会放

    2024年02月03日
    浏览(28)
  • 【Python】使用pandas将数据写入excel文件中

    本文主要简单介绍一下使用python的pandas库来将数据写入到excel文件中。 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。在命令行输入pip install pandas进行安装即可,如果安装不成功,有安装Pycharm的小伙伴也可以进入python interpreter界面,搜索pand

    2024年02月15日
    浏览(54)
  • 使用python读Excel文件并写入另一个xls模版

    效果如下: 原文件内容 转化后的内容 大致代码如下: 1. load_it.py    2. gen_excel.py     

    2024年02月12日
    浏览(35)
  • Python 全栈系列239 使用消息队列完成分布式任务

    在Python - 深度学习系列32 - glm2接口部署实践提到,通过部署本地化大模型来完成特定的任务。 由于大模型的部署依赖显卡,且常规量级的任务需要大量的worker支持,从成本考虑,租用算力机是比较经济的。由于任务是属于超高计算传输比的类型,且算力机随时可能出现不稳定

    2024年04月13日
    浏览(39)
  • Python 写入json 写入jsonl

    Python处理json文本文件主要是以下四个函数: 函数 作用 json.dumps 对数据进行编码,将python中的字典 转换为 字符串 json.loads 对数据进行解码,将 字符串 转换为 python中的字典 json.dump 将dict数据写入json文件中 json.load 打开json文件,并把字符串转换为python的dict数据 写入json的内容只

    2024年02月12日
    浏览(33)
  • Python+pandas数据直接写入和接续写入Excel

    数据类型(3行7列的数据)和: (7行1列的数据) 直接写入两个不同的sheet 效果: 效果 效果 直接写入:(12条消息) 【python学习】-将数据输出存储到CSV或xls,xlsx文件(并实现将不同数据存储在同一份文件的不同sheet)_electrochemjy的博客-CSDN博客_python输出数据到csv 接续写入:Python

    2024年02月03日
    浏览(45)
  • python如何写入csv

    在使用python对文件操作的过程中,你肯定碰到过对csv文件的操作,下面就python对csv文件的操作进行详述。 CSV(Comma-Separated Values)逗号分隔符,也就是每条记录中的值与值之间是用分号分隔的。 打开CSV文件并写入一行数据 这里的操作是实现csv文件的打开以及写入一行数据,首

    2024年04月14日
    浏览(53)
  • python-文件的创建与写入

    功能: 生成文件对象,进行创建,读写操作 用法: open(path,mode) 参数说明∶ path:文件路径 mode :操作模式 返回值: 文件对象 举例: f = open(\\\'d://a.txt\\\' , ‘w\\\') 写入模式(“w”):打开文件进行写入操作。如果文件已存在,则会覆盖原有内容;如果文件不存在,则会创建新文件。 注意

    2024年02月11日
    浏览(35)
  • Python操作写入/读取csv文件

    网络工程师Python数据存储(第1节,CSV文件) 网络自动化运维演进的一个方向大致过程:网络工程师从关注配置制作脚本,完成后上设备刷配置,慢慢地演化为网络工程师关注和确定设备配置的某些重要控制参数,而把制作脚本任务交给Jinja2等去渲染生成,把下发脚本工作交

    2024年02月03日
    浏览(59)
  • Python08--文件读取及写入操作

    有些时候我们在处理数据之后就会想将我们的数据保存到文件中,实现数据的持久化。而不仅仅是输出到我们的集成开发环境的控制台上(直接打印在控制台上并不能够实现保存我们数据的功能,只要我们的集成开发环境已关闭,或者是电脑关机,那么我们打印出来的数据也

    2024年02月05日
    浏览(93)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包