簡體   English   中英

如何使用 Scala (Spark) API 從 HBase 讀取列名稱和值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM