[英]Reading Hbase table values in Scala using Spark RDD
我们已经从HBase表创建了SparkRDD,现在想访问其元素。 这是我们所做的:
val hBaseRDD = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat], classOf[ImmutableBytesWritable], classOf[Result])
println("hbase RDD:")
hBaseRDD.collect().foreach(println)
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})
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]
您可以将columnFamily
和columnName
作为参数传递给Result.getValue
方法,以检索每个列的值:
hBaseRDD.collect().foreach(r => {
val columnValue = r.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(columnName))
})
您正在执行的操作是隐式调用Result
的toString
方法(代码在此处 ),该方法又调用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.