Spark读写HBase表
摘要
本文介绍如何使用 Spark 2.3.2 实现对 HBase 1.4.8 表的读写操作,通过 Scala 语言将 CSV 数据写入 HBase,并利用 Spark SQL 分析数据。代码示例涵盖数据批量写入、全表扫描、数据类型转换及结构化查询,适合大数据开发人员快速掌握 Spark 与 HBase 的集成方法。
一、实验环境准备
1. 技术版本
- Spark:2.3.2
- HBase:1.4.8
- Scala:2.11
- 开发工具:IntelliJ IDEA
- 依赖管理:Maven
2. Maven 依赖配置
在 pom.xml
中添加以下依赖:
<dependencies>
<!-- Spark 核心与 SQL -->
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.11</artifactId>
<version>2.3.2</version>
</dependency>
<!-- HBase 客户端与 MapReduce 支持 -->
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>1.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.4.8</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-mapreduce</artifactId>
<version>1.4.8</version>
</dependency>
<!-- Hadoop 客户端(与 HBase 兼容) -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
二、实验步骤
1. 数据准备
- 文件路径:
D:\\JavaProjects\\SparkAllProjects\\data\\emp.csv
- 数据格式(示例):
字段含义:7369,SMITH,CLERK,7902,1980-12-17,800,,20 7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30
员工ID,姓名,职位,上级ID,入职日期,薪资,奖金,部门ID
2. HBase 表结构设计
- 表名:
employee
- 列族:
info
- 列标识:
ename
:姓名job
:职位mgr
:上级IDhiredate
:入职日期salary
:薪资comm
:奖金deptNo
:部门ID
3. 代码实现
3.1 数据写入 HBase(writeDataToHBase
方法)
- 核心逻辑:
- 读取 CSV 文件为 DataFrame。
- 按分区遍历数据,批量创建
Put
对象。 - 通过 HBase 连接将数据写入表中,避免单条写入性能瓶颈。
- 核心代码
def writeDataToHBase(spark: SparkSession): Unit = { // 2.读取数据文件 val empDF = spark.read.csv("file:///D:\\JavaProjects\\SparkAllProjects\\data\\emp.csv") // 3.按照DataFrame分区写入HBase表中 empDF.foreachPartition(p => { // 3.1 配置HBase连接地址:初始化conf配置对象、配置zk连接地址及其端口 val conf = HBaseConfiguration.create() conf.set("hbase.zookeeper.quorum", "s1,s2,s3") conf.set("hbase.zookeeper.property.clientPort", "2181") // 3.2 在每个HBase节点中创建HBase的链接对象 val conn = ConnectionFactory.createConnection(conf) // 3.3 获取HBase目标表 val table = conn.getTable(TableName.valueOf(TABLE_NAME)) // 批量提交时,使用list列表存储put,当达到batchSize大小时提交一次 val batchSize = 14 // emp.csv就14条记录,所以设置成14条提交一次 var puts = List[Put]() // puts数组 // 3.4 将dataframe中的每个分区数据写入table表中 try { p.foreach(row => { // 3.5 获取每行中的各个列的数据 val empNo = row.getString(0) val ename = row.getString(1) val job = row.getString(2) val mgr = row.getString(3) val hireDate = row.getString(4) val salary = row.getString(5) val comm = row.getString(6) val deptNo = row.getString(7) var mgrStr = "0" if (mgr != null) { mgrStr = mgr } var commStr = "0.0" if (comm != null) { commStr