Python使用happybase写入HBase

news2024/11/17 2:39:47

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))

  •  获取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()  # 关闭传输

四、数据验证

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

  • count命令

hbase shell中

count "rawdata"

  • 调用Mapreduce

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法的奇妙冒险

排序算法的奇妙冒险 一.排序的概念1.1 排序的定义1.2 排序的稳定性1.3 排序的内排序和外排序 二.插入排序2.1 直接插入排序2.2 希尔排序 三.选择排序3.1直接选择排序3.2 堆排序 四.交换排序4.1 冒泡排序4.2 快速排序**选取基准值的方法**快速排序的优化非递归实现快速排序 五.归…

Web3简述MetaMask并演示谷歌安装MetaMask扩展程序方式

Web3到现在理论这段是说的有点太多了 那么 我们先来看个东西 叫 MetaMask 这个在我们项目开发过程中需要使用 其实 你如果去找MetaMask 可能会被一些关键字下到 可能会看到 虚假 诈骗等关键字 因为 这个东西本事就是一个开源的以太坊的一个钱包 那么 钱包肯定就是用来管理资产…

LoadDef python工具包学习一:计算love数

首先在github下载这个工具箱:https://github.com/hrmartens/LoadDef 下载完毕,解压缩进入如下的界面,点击进入working工作文件夹。在doc文件夹里面有帮助文档和教程,有需要的可以仔细阅读。 loaddef主要的功能模块包括&#xff1…

力扣日记1494

1. 题目 [LeetCode 1494. 并行课程 II]https://leetcode.cn/problems/parallel-courses-ii/) 1.1 题意 严格按照选课先修顺序选课,每个学期选课数有上限,求选完所有课程的最短学期数 1.2 分析 这道题的数据量很小,而且作为困难题&#xff…

一起学 WebGL:纹理对象学习

大家好,我是前端西瓜哥,今天我们来了解 WebGL 的纹理对象(Texture) 纹理对象,是将像素(texels)以数组方式传给 GPU 的对象,常见场景是贴图,就是将图片的数据应用到 3D 物…

vue 根据word摸板导出word文档,并压缩为zip

yarn add jszip3.10.1 yarn add jszip-utils0.1.0 yarn add pizzip3.1.4 yarn add docxtemplater3.29.5 yarn add docxtemplater-image-module-free1.1.1 yarn add file-saver2.0.5 注意:这里的fileUrl必须是绝对路径,否则可能会报 is not zip的错误&…

当pytest遇上poium会擦出什么火花

当pytest遇上poium会擦出什么火花 首先,创建一个test_sample/test_demo.py 文件,写入下面三行代码。 def test_bing(page):page.get("https://www.bing.com")assert page.get_title "必应"不要问题 page 从哪里来,打开…

(LLM) 的所有知识;10分钟了解向量数据库;微软 Bing 可以识别图片了;

🦉 AI新闻 🚀 微软 Bing 可以识图」了,吊打 GPT-4? 摘要:微软 Bing 最新识图功能让用户可以上传图片并进行编程、做题、看病等操作,还能分析梗图笑点。然而在某些情况下表现不佳,例如无法数清…

技术分享 | i.MX8M Plus开发板 固定IP地址以及单网口多IP设置

以启扬IMX8MP开发板为例,给大家分享固定IP地址以及单网口多IP设置的步骤流程。 固定IP地址设置 20-wired.network 重启Network生效 网口多ip设置 对于一些网络管理的命令 connman设置(参考) imx8 yocto系统的init system使用systemd&#xff…

精选Java SSM 框架基础面试题

一、Spring面试题 1、Spring 在ssm中起什么作用? Spring:轻量级框架作用:Bean工厂,用来管理Bean的生命周期和框架集成。两大核心:1、IOC/DI(控制反转/依赖注入) :把dao依赖注入到service层,se…

STM32 GPIO 详解

0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或者控制外部器件工作,即输入输出 1.2 STM32 的 GPIO 特点 不同型号&#xff0…

SpringBatch从入门到实战(五):执行上下文和单步骤重启

一:执行上下文 1.1 Job Context 作业上下文 JobContext 绑定 JobExecution 执行对象,为Job作业执行提供执行环境(上下文)。 1.2 Step Context 步骤上下文 StepContext 绑定 StepExecution 执行对象,为Step步骤执行提供执行环境(上下文)。 …

【剑指offer专项突破版】栈篇——“C“

文章目录 前言一、后缀表达式题目分析思路分析代码 二、小行星碰撞题目分析思路分析代码 三、每日温度题目分析思路分析代码 四、直方图最大矩形面积题目分析思路分析代码 五、矩阵中最大的矩形题目分析思路分析代码 总结 前言 剑指offer专项突破版(力扣官网&#x…

IBM不藏私:深刻解析量子计算机的突破和机遇

​ 巴伐利亚科学部长Markus Blume在莱布尼茨超级计算中心与Dieter Kranzlmlle(左)一起观看量子计算机的部分构件。(图片来源:网络) 关于量子计算机的研究已进行了数十年,目前还尚未生产一台能够掀起计算革命…

Vue全家桶(一):Vue基础+Vue-Cli+Vue组件化+过渡动画

目录 1.Vue概述1.1 认识Vue1.2 Vue的两核心1.3 Vue的初体验1.4 Vue的生命周期 2. Vue-CLI (Command Line Interface)3. Vue基本使用3.1 传统开发模式对比3.2 Vue.js引入3.3 Vue.js 案例分析3.3.1 实例参数el、data、methods的写法 4. Vue模板语法4.1 插值语法 {{xxx}}4.2 指令语…

vue3+ts:shims-vue.d.ts

一、本文引子 uniapp(3.8.4.20230531) vue3 ts vite 项目 在搭建这个base项目的时候出现红素波浪线如图,代码运行正常,但是看起来很难受,于是各种查找,能找到的资料很少,可能和我提问不够准…

【备战秋招】每日一题:4月23日美团春招第一题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第一题-申请奖学金 在线评测链接:P1245 题目内容 塔子哥是一个热爱学习的大学生,他的梦想是成为一名优秀的算法竞赛高手。为了实现自己的梦想,他需…

代理ip匿名原理及那些行业需要代理ip

互联网的高速发展,连带了代理ip也受到了更多人的使用,不同的行业都存在使用代理ip的情况,同时代理ip也以为匿名程度分成了高匿、普匿、透明代理,那么代理ip匿名的原理是什么呢?又有哪些行业需要代理ip呢?下…

flume环境配置-传输Hadoop日志(namenode或datanode日志)

解压文件 修改文件名 配置环境变量 执行flume-ng version 将flume-env.sh.template改名为flume-env.sh, 并修改其配置 启动Flume传输Hadoop日志 启动flume 解压文件 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /opt 修改文件名 mv apache-flume-1.9.0-b…

全面安全防护,加速企业创新发展——亚马逊云科技re:Inforce全球大会

亚马逊云科技re:Inforce 2023全球大会于当地时间2023年6月13日在美国加州安纳海姆拉开帷幕。在大会上,亚马逊云科技宣布推出十多项安全新服务及功能,下面就来一览本次大会的风采。 “Security is our top priority.” “安全是我们的首要优先级”&#…