Spark操作HBase的数据,实现列值的计算

news2024/11/16 15:50:34

本文将介绍如何使用Spark操作HBase的数据,实现列之间的计算,以特征值计算为例。特征值是指从原始数据中提取出来的具有代表性或判别性的数值,可以用于数据分析或机器学习等领域。本文将使用hbase-spark连接器,通过Spark RDD的方式,读取和写入HBase的表,实现对Sentinel-2卫星影像数据的特征值计算。

主要内容如下:

  • 创建SparkSession和HBaseConfiguration对象。
  • 读取HBase表的数据,并转化成RDD。
  • 进行列式计算,得到特征值,并转化成RDD。
  • 写入HBase表的数据。
  • 验证HBase表的数据。

目录

一、环境准备

二、创建SparkSession和HBaseConfiguration对象

三、读取HBase表的数据,并转化成RDD

四、计算特征值,并转化成RDD

五、写入HBase表的数据

六、关闭SparkSession

七、验证HBase表的数据


 一、环境准备

  • 安装Spark环境,HBase环境等,配置好集群。本文所用环境具体配置情况如下

分布式存储与并行处理环境配置:Hadoop、HBase和Spark等_runepic的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/weixin_40694662/article/details/130030611

  • 准备HBase的表,并导入一些测试数据。本文使用的是t3表和t3index表,分别存储了Sentinel-2卫星影像数据和时间索引。可以使用以下命令:
create 't3', 'f1'
create 't3index', 'f1'
put 't3', '1000', 'f1:2019-01-01B2', '100'
put 't3', '1000', 'f1:2019-01-01B3', '200'
put 't3', '1000', 'f1:2019-01-01B4', '300'
put 't3', '1000', 'f1:2019-01-01B8', '400'
put 't3', '1000', 'f1:2019-01-01B11', '500'
put 't3', '1000', 'f1:2019-01-01B12', '600'
put 't3index', '0001', 'f1:td', ':2019-01-01B:'

 

二、创建SparkSession和HBaseConfiguration对象

  • 导入需要的模块,包括org.apache.hadoop.hbase、org.apache.hadoop.hbase.mapreduce、org.apache.hadoop.io等。例如:
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.{Put, Result}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapreduce.{TableInputFormat, TableOutputFormat}
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.io.NullWritable
import org.apache.spark.sql.SparkSession
  • 创建一个SparkSession对象,并设置应用名和运行模式。打包运行时需要注释.master("local") 例如:
val spark = SparkSession.builder().appName("SparkHBaseRDDfeature")
  .master("local")
  .getOrCreate()
  • 创建一个HBaseConfiguration对象,并设置Zookeeper的地址和端口。例如:
val hbaseConf = HBaseConfiguration.create()
hbaseConf.set("hbase.zookeeper.quorum", "hadoop100:2181,hadoop200:2181,hadoop201:2181")
hbaseConf.set("hbase.zookeeper.property.clientPort", "2181")

三、读取HBase表的数据,并转化成RDD

  • 使用newAPIHadoopRDD方法,根据表名和列族名获取一个RDD。该RDD的元素类型为(ImmutableBytesWritable, Result),其中ImmutableBytesWritable是行键的封装,Result是行数据的封装。例如:
val tablename = "t3"
hbaseConf.set(TableInputFormat.INPUT_TABLE, tablename)
val hBaseRDD = spark.sparkContext.newAPIHadoopRDD(hbaseConf, classOf[TableInputFormat],
  classOf[ImmutableBytesWritable],
  classOf[Result])
  • 使用map方法,将RDD中的每个元素转换为一个元组,其中包含行键和列值。例如:
val hBaseRDD2 = hBaseRDD.map{case (k,v) =>
  val rowkey = Bytes.toString(k.get())
  val b2 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B2".getBytes)).toDouble
  val b3 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B3".getBytes)).toDouble
  val b4 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B4".getBytes)).toDouble
  val b8 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B8".getBytes)).toDouble
  val b11 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B11".getBytes)).toDouble
  val b12 = Bytes.toString(v.getValue("f1".getBytes, "2019-01-01B12".getBytes)).toDouble
  (rowkey, b2, b3, b4, b8, b11, b12)
}

四、计算特征值,并转化成RDD

  • 定义一个函数,用于计算特征值。该函数接受六个参数,分别是Blue、Green、Red、NIR、SWIR_1和SWIR_2,分别对应Sentinel-2卫星影像的六个波段。该函数返回一个元组,包含三个特征值,分别是DVI、RVI和NDVI。例如:
def calculateFeatures(Blue: Double, Green: Double, Red: Double, NIR: Double, SWIR_1: Double, SWIR_2: Double): (Double, Double, Double) = {
  val DVI = NIR - Red
  val RVI = NIR / Red
  val NDVI = (NIR - Red) / (NIR + Red)
  (DVI, RVI, NDVI)
}
  • 使用map方法,将RDD中的每个元素转换为一个(NullWritable, Put)类型的元组,用于写入HBase表。其中NullWritable是空键的封装,Put是写入操作的封装。例如:
val hBaseRDDre = hBaseRDD2.map{case (rowkey, b2, b3, b4, b8, b11, b12) =>
  // 创建一个Put对象,并设置行键
  val put: Put = new Put(rowkey.getBytes)
  // 调用calculateFeatures函数,计算特征值
  val (DVI, RVI, NDVI) = calculateFeatures(b2, b3, b4, b8, b11, b12)
  // 将特征值作为列值,添加到Put对象中
  put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("DVI"), Bytes.toBytes(DVI.toString))
  put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("RVI"), Bytes.toBytes(RVI.toString))
  put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("NDVI"), Bytes.toBytes(NDVI.toString))
  // 返回(NullWritable.get(), put)类型的元组
  (NullWritable.get(), put)
}

五、写入HBase表的数据

  • 设置写入HBase表的表名。例如:
hbaseConf.set(TableOutputFormat.OUTPUT_TABLE, "t3feature")
  • 借助于mapreduce的Job对象添加参数配置。例如:
val job: Job = Job.getInstance(hbaseConf)
job.setOutputFormatClass(classOf[TableOutputFormat[NullWritable]])
job.setOutputKeyClass(classOf[NullWritable])
job.setOutputValueClass(classOf[Put])
  • 使用saveAsNewAPIHadoopDataset方法,将RDD写入HBase表。例如:
hBaseRDDre.saveAsNewAPIHadoopDataset(job.getConfiguration)

 

六、关闭SparkSession

  • 使用stop方法,关闭SparkSession。这样可以释放SparkContext占用的资源,避免资源浪费或冲突。例如:
spark.stop()

七、验证HBase表的数据

  • 使用exit命令,退出spark-shell。例如:
exit
  • 使用hbase shell命令,进入HBase交互式shell。例如:
hbase shell
  • 使用scan命令,扫描HBase表的数据,并查看特征值。例如:
scan 't3feature'
  • 使用exit命令,退出HBase shell。例如:
exit

 

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

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

相关文章

深度解析:圣湘生物的数字化转型升级之路(附方案详情)

随着“互联网”医疗技术在医疗行业的应用不断深化,数字化正在加速推进IVD行业的创新。 当前,IVD企业应对机遇和挑战的核心是提升竞争力。 IVD企业基于企业资源,提升综合竞争力主要分【硬实力】和【软实力】。 一方面:需要企业不…

跟李沐学AI;Meta可能让其开源AI模型商业化,让开发者赚钱

🦉 AI新闻 🚀 Meta可能让其开源AI模型商业化,让开发者赚钱 摘要:Meta正考虑将其开源大语言模型(LLM)的下一个版本用于商业用途,这可以为聊天机器人等提供支持。此举可能会让更多开发者使用替代…

张量分解(Cp、Tuker、Block-Term)

张量 张量是向量或矩阵在维度空间上的高阶扩展。 一个 ( p , q ) (p,q) (p,q)型的张量 T T T被定义为一个多重线性映射。 T : V ∗ ⋯ V ∗ V ⋯ V ↦ R , T:V^* \times \dots \times V^* \times V \times \dots \times V \mapsto \R, T:V∗⋯V∗V⋯V↦R, 其中 V V V 是…

用GPT4写2023高考语文作文,新课标I卷,Ⅱ卷

文章目录 新课标Ⅰ卷新课标Ⅱ卷总结 每年的高考语文题目都会是热议的话题,今年同样也不例外。但是今年讨论的话题除了作文题目本身之外,对于chatgpt写出的作文会是什么样子的也​让广大网友同样期待 新课标Ⅰ卷 好的故事,可以帮我们更好地表达…

chatgpt赋能python:Python怎么让结果同行输出

Python怎么让结果同行输出 在Python编程中,我们经常需要打印出一系列的结果并在同一行输出。这对于输出更为整洁的结果和提高代码清晰度都是非常有帮助的。下面就让我们来介绍一些实现这一功能的方法。 方法一:使用 end 参数 在Python的 print() 函数…

机器视觉_HALCON_模板匹配_1.CreateScaledShapeModel

文章目录 一、前言二、create_scaled_shape_model 算子2.1 名称2.2 算子签名2.3 描述2.3.1 输入参数详述2.3.2 完整的预生成模型 2.4 执行信息2.5 参数2.6 执行结果2.7 可能的前驱算子2.8 可能的后继算子2.9 替代选择 一、前言 在HALCON算子手册中,对算子的介绍通常…

chatgpt赋能python:Python访问数据库

Python访问数据库 Python是一种高级编程语言,在数据分析、科学计算和Web开发等领域都有广泛的应用。Python还有一个很强的优势就是它能够方便地访问数据库。在本文中,我们将介绍Python如何与数据库交互以及Python数据库API的使用。 Python的数据库API …

chatgpt赋能python:Python如何访问数组中的元素

Python如何访问数组中的元素 Python是一种高级编程语言,访问数组中的元素也非常简单。 它提供了一种简单而灵活的方式访问数组中的元素,这使得在Python中使用数组变得非常容易。在本文中,我们将介绍如何在Python中访问数组中的元素以及如何使…

DecimalFormat基本用法

1.保留两位小数(截断) 下面展示一些 内联代码片。 double num 11.256;DecimalFormat df new DecimalFormat("#.##");//指定RoundingModedf.setRoundingMode(RoundingMode.DOWN);String str df.format(num);double formatNum Double.parseDouble(str)…

2023年05月份青少年软件编程Scratch试卷三级真题

2023-05 Scratch三级真题 分数:100 题数:38 测试时长:60min 一、单选题(共25题,共50分) 1. 关于变量,下列描述错误的是?(A)(2分) (变量那一栏…

对于ChatGPT,马化腾、马斯克等科技大佬竟然这么说!

ChatGPT一夜爆火之后,国内几乎是各大互联网公司都在摩拳擦掌,跃跃欲试,从百度的文心一言,到阿里的通义千问,还有360的智脑,讯飞的星火,语言大模型如雨后春笋一般涌出,犹如2014年新能…

代码审计——未授权访问详解

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 未授权访问漏洞,是在攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通…

express 基础知识实战

1 Express框架介绍与安装 1.1 Express 安装 生成配置文件package.json npm init --yes安装 Express 框架,就是使用 npm 的命令。 npm install express --save yarn add express --save初次使用 const express require(express) //实例化express const app ex…

全志V3S嵌入式驱动开发(u盘写读)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于现在的soc来说,基本上usb是标配的。它一般需要支持usb host、device和otg三种模式。简单解释下,host模式,就…

数据库原理与应用第2章作业

数据库原理与应用第2章作业 一.单选题(共15题,45分)二.填空题(共5题,25分)三.简答题(共1题,10分)四.计算题(共1题,20分) 一.单选题(共15题,45分) 1.(单选题,3分)关系数据库管理系统应能实现的专门关系运算…

chatgpt赋能python:Python怎么让输出换行?

Python怎么让输出换行? 对于有10年python编程经验的工程师,输出换行是一项基本的操作。在本篇文章中,我们将讨论Python中的换行方法,以便您可以更好地控制输出。 什么是Python的换行符? 在Python中,换行…

SPI总线

目录 声明 1、 SPI简介 2、 SPI特点 2.1采用主-从模式(Master-Slave) 的控制方式 2.2采用同步方式(Synchronous)传输数据 2.3数据交换(Data Exchanges) 2.4 SPI有四种传输模式 2.5 SPI只有主模式和从模式之分。 3、 工作机制 3.1概述 3.2 Timing 声明 转自&#xf…

多层感知机与深度学习算法概述

多层感知机与深度学习算法概述 读研之前那会儿我们曾纠结于机器学习、深度学习、神经网络这些概念的异同。现在看来深度学习这一算法竟然容易让人和他的爸爸机器学习搞混…可见深度学习技术的影响力之大。深度学习,作为机器学习家族中目前最有价值的一种算法&#…

6.compute部署nova服务

Nova-compute 是一个非常重要的守护进程,负责创建和终止虚拟机实例,即管理着虚拟机实例的生命周期,在计算节点上运行,负责管理节点上的实例Instance,例如:创建、关闭、重启、挂起、恢复、中止、调整大小、迁…

chatgpt赋能python:Python计算圆的周长

Python计算圆的周长 Python是一种简单易学的编程语言,被广泛应用于各种领域,包括科学、数据分析、网站开发等等。在本文中,我们将介绍如何使用Python计算圆的周长。 什么是圆的周长 圆的周长是指圆周的长度,也就是圆内任意两点…