[英]How to read columns names and values from HBase using Scala (Spark) API?
我在 hbase 中有一個巨大的表,可能有數百萬行。 [HBase 表結構][1] 我正在嘗試使用 (STARTROW & ENDROW) 和sc.newAPIHadoopRDD
函數訪問表的塊。 我試圖找到一種方法來從生成的 RDD 中獲取列限定符名稱。 由於每一行可以有任意數量的列和列限定符,我想通過 Rowkey 獲取每一行的列族。 簡而言之,我想在 Spark 中創建一個 Dataframe,它看起來有點像這樣:
ROWKEY COLUMN NAME VALUE
ROW1 ColumnFamily:ColumnQualifier1 Value="XX"
ROW1 ColumnFamily:ColumnQualifier2 Value="XX"
ROW1 ColumnFamily:ColumnQualifier3 Value="XX"
ROW1 ColumnFamily:ColumnQualifier4 Value="XX"
ROW1 ColumnFamily:ColumnQualifier5 Value="XX"
ROW1 ColumnFamily:ColumnQualifier6 Value="XX"
ROW2 ColumnFamily:ColumnQualifier1 Value="XX"
ROW2 ColumnFamily:ColumnQualifier2 Value="XX"
ROW2 ColumnFamily:ColumnQualifier3 Value="XX"
ROW2 ColumnFamily:ColumnQualifier4 Value="XX"
ROW3 ColumnFamily:ColumnQualifier1 Value="XX"
ROW4 ColumnFamily:ColumnQualifier2 Value="XX"
所以,從sc.newAPIHadoopRDD
返回的RDD,我想知道一種訪問列名的方法。 一旦我有了列限定符,我就可以獲得 family 的值:使用rdd.getValue(family,qualifier)
函數的限定符組合。
val kvRDD = sc.newAPIHadoopRDD(hbaseConf,classOf[TableInputFormat],classOf[ImmutableBytesWritable], classOf[Result])
val resultRDD = kvRDD.map(tuple => tuple._2)
val keyValueRDD = resultRDD.map(result => {
var resultStrings: List[Object] = List()
var navigablemap=result.getNoVersionMap()
val vallist = navigablemap.values()
for (each <- vallist) {
resultStrings = resultStrings ::: List(each)
}
resultStrings
})
但這會返回一個 rdd,其中每一行都被加密。 非常感謝Scala代碼的任何幫助,謝謝
val dataFrame = kvRDD.map(x => {
val rowkey=Bytes.toString(x._2.getRow)
val families=x._2.getNoVersionMap.keySet().iterator()
var colums = scala.collection.mutable.Map[String, String]()
while (families.hasNext){
val family=families.next();
val qualifiers=x._2.getFamilyMap(family).keySet().iterator()
while(qualifiers.hasNext){
val qualifier=qualifiers.next();
colums+=((Bytes.toString(family)+":"+(Bytes.toString(qualifier))->Bytes.toString(x._2.getValue(family,qualifier))))
}
}
(rowkey,colums)
}).toDF()
dataFrame.select($"_1".alias("ROWKEY"), functions.explode($"_2").as(List("COLUMN NAME","VALUE"))).show
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.