Pyspark以DataFrame格式读写Hbase
本文代码参考了__miss的博客,特别感谢,原文地址如下
链接:https://blog.csdn.net/u011412768/article/details/93404921
我使用的环境:CDH集群,资源监控使用的yarn, spark2.3,hbase1.6 。
读写方式:Hbase默认API
默认环境大家都已配置好。代码可以直接使用。
本文档代码分为两个部分:
一、PySpark读取Hbase表,并将RDD转换为DataFrame格式;
二、PySpark写入Hbase,将DataFrame格式数据写入Hbase;
一、PySpark读取Hbase表,并将RDD转换为DataFrame格式
1、定义两个函数用于转换读取Hbase数据的RDD。
#! /bin/python2
# --*-- coding:utf-8 --*--
from pyspark.sql import SparkSession
import json
def row_transform(row_cells_info, hbase_structure):
"""
这个函数是一行一行读取hbase_rdd中的record,然后将每个列里面的数据提取出来,最终形成一个dict,这个dict的结构
大概是这样的{column_name1:value1, column_name2:value2, column_name3:value3},如果hbase里面有些列没有值,就是
压根没存这个字段,可以给这个字段填充一个“Null”值,以便后续可以转为dataframe格式(但是这里的“Null”就是一个字
符串,和dataframe里面本身没有值自动默认为的“Null”是不一样的,前者在用filter这个函数是,条件要写“!=Null”,而后
者则需要用“isNotNull()”这个函数)
"""
row_cell_info_list = [json.loads(i) for i in row_cells_info]
row_dict = {
}
for hbase_index in range(len(hbase_structure)):
for cell_index in range(len(row_cell_info_list)):
column_name = row_cell_info_list[cell_index]['qualifier']
column_value = row_cell_info_list[cell_index]['value']
if hbase_structure[hbase_index] == column_name:
row_dict[column_name] = column_value.encode('utf-8')
break
else:<