PySpark操作HBase时设置scan参数

时间:2020-12-30 05:26:53

在用PySpark操作HBase时默认是scan操作,通常情况下我们希望加上rowkey指定范围,即只获取一部分数据参加运算。翻遍了spark的python相关文档,搜遍了google*也没有具体的解决方案。既然java和scala都支持,python肯定也支持的。

翻了一下hbase源码

org.apache.hadoop.hbase.mapreduce.TableInputFormat

setConf方法里原来是根据特定的字符串对scan进行配置,那么在Python里对conf就可以进行相应的设置,这些设置主要包括:

hbase.mapreduce.scan.row.start
hbase.mapreduce.scan.row.stop
hbase.mapreduce.scan.column.family
hbase.mapreduce.scan.columns
hbase.mapreduce.scan.timestamp
hbase.mapreduce.scan.timerange.start
hbase.mapreduce.scan.timerange.end
hbase.mapreduce.scan.maxversions
hbase.mapreduce.scan.cacheblocks
hbase.mapreduce.scan.cachedrows
hbase.mapreduce.scan.batchsize

首先创建测试表

hbase> create 'test', 'f1'
hbase> put 'test', 'row1', 'f1', 'value1'
hbase> put 'test', 'row2', 'f1', 'value2'
hbase> put 'test', 'row3', 'f1', 'value3'
hbase> put 'test', 'row4', 'f1', 'value4'

  

然后,设置scan范围的示例代码如下

sc = SparkContext(appName=settings.APP_NAME)
conf = {
"hbase.zookeeper.quorum": settings.HBASE_HOST,
"hbase.mapreduce.inputtable": "test",
"hbase.mapreduce.scan.row.start": "row2"
}
rdd = sc.newAPIHadoopRDD(
"org.apache.hadoop.hbase.mapreduce.TableInputFormat",
"org.apache.hadoop.hbase.io.ImmutableBytesWritable",
"org.apache.hadoop.hbase.client.Result",
keyConverter="org.valux.converters.ImmutableBytesWritableToStringConverter",
valueConverter="org.valux.converters.HBaseResultToStringConverter",
conf=conf)
result = rdd.collect()
for (k, v) in result
print k, v

org.valux.converters.ImmutableBytesWritableToStringConverterorg.valux.converters.HBaseResultToStringConverter 是我自己实现的两个转换类,也可以用spark默认自带的converter,具体可以参考hbase_inputformat.py,不过提交时请带上相应的jar包