繁体   English   中英

使用Spark RDD在Scala中读取Hbase表值

[英]Reading Hbase table values in Scala using Spark RDD

我们已经从HBase表创建了SparkRDD,现在想访问其元素。 这是我们所做的:

  1. 创建RDD
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result])
println("hbase RDD:")
hBaseRDD.collect().foreach(println)
  1. hBaseRDD的o / p如下:
(31 30 31,keyvalues={100/f1:id/1518081262631/Put/vlen=3/seqid=0, 
100/f1:name/1518081278652/Put/vlen=3/seqid=0})
(31 30 31,keyvalues={101/f1:id/1518081307150/Put/vlen=3/seqid=0, 
101/f1:name/1518081291946/Put/vlen=3/seqid=0})
  1. HBase表中的数据是:
 ROW                      COLUMN+CELL
 100                      column=f1:id, timestamp=1518081262631, value=100
 100                      column=f1:name, timestamp=1518081278652, value=abc
 101                      column=f1:id, timestamp=1518081307150, value=102
 101                      column=f1:name, timestamp=1518081291946, value=def

因此,Spark RDD返回的是HBase表中实际数据的长度,而不是实际数据本身的长度。 如何从HBase表中获取实际数据?

收集RDD时,将有一个Array[Result]

您可以将columnFamilycolumnName作为参数传递给Result.getValue方法,以检索每个列的值:

hBaseRDD.collect().foreach(r => {
  val columnValue = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName))
})

您正在执行的操作是隐式调用ResulttoString方法(代码在此处 ),该方法又调用Cell实现的toString方法(最可能是KeyValue ,其代码在此处 )。

如您所见, toString方法的实现不会打印该值,即使该值在那里也是如此。

HBase将所有内容存储为原始字节,因此要漂亮地打印它们,您必须在结果上调用value方法,然后将其从Array[Byte]解码为您感兴趣的内容。

def decodeValue(result: Result): Any = ???
hBaseRDD.map(result => s"$result -> ${decodeValue(result)}").foreach(println)

您必须基于您的架构实现decodeValue

要获得有关如何解码值的一些启发,可以看一下它们如何在Eel源代码中解码HBase值。

另外,您可以通过在单元格上调用value方法,然后漂亮地打印字节数组,来实现decodeValue函数,以原始格式直接打印值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM