2017-05-10 296 views
0

我使用Phoenix在Hbase中創建下表。如何從hbase列讀取日期,時間和時間戳

CREATE TABLE test_Table 
(test_date date not null, 
CONSTRAINT PK_test PRIMARY KEY (test_date) 
); 

然後使用以下命令將一條記錄插入到相同的記錄中。

upsert into test_Table(test_date) values('2013-11-30'); 

我能夠從Hbase使用讀取字符串,整型,浮點數和雙數據類型值。 Hbase客戶端API,但不是日期類型。

我正在使用以下代碼來閱讀所有,但不知道如何從字節中讀取日期。

import org.apache.spark._ 
    import org.apache.spark.rdd._ 
    import org.apache.spark.sql.SQLContext 
    import org.apache.spark.sql.DataFrame 
    import org.apache.hadoop.conf.Configuration 
    import org.apache.hadoop.fs.Path 
    import org.apache.hadoop.hbase.HBaseConfiguration 
    import org.apache.hadoop.hbase.spark.HBaseContext 
    import org.apache.hadoop.hbase.client.Scan 
    import org.apache.hadoop.hbase.util.Bytes 
    import org.apache.spark.sql.types._ 
    import org.apache.hadoop.hbase.filter.PrefixFilter 
    import org.apache.hadoop.hbase.{ TableName, HBaseConfiguration } 
    import java.io.File 
    import java.text.SimpleDateFormat 

def scanHBaseTable(tableName: String, sqlContext: SQLContext): Unit = { 

@transient val conf = getHbaseConfiguration(); 
@transient var scan = new Scan() 
//scan.setAllowPartialResults(Constants.ALLOW_HBASE_PARTIAL_SCAN) 
//scan.setCaching(Constants.HBASE_SCAN_CACHE) 

val hbaseContext = new HBaseContext(sqlContext.sparkContext, conf); 
val hbaseRawRDD = hbaseContext.hbaseRDD(TableName.valueOf(tableName), scan) 
hbaseRawRDD.foreach(v => 
    { 
    println(Bytes.toString(v._1.get())) 
    println((new SimpleDateFormat("yyyy-MM-dd").parse(Bytes.toString(v._1.get())))) 
    }) 

println("Length: " + hbaseRawRDD.map(r => r._1.copyBytes()).collect().length); 

}

有人可以給我提供了相同的解決方案?

回答

0

v的類型是(ImmutableBytesWritable, Result)因此,您可以從Result對象獲取日期。 您可以使用方法result.getColumnLatestCell(family, qualifier).getTimestamp

我不知道Phoenix正在使用哪些系列或限定符,您可以列出表格中的所有值並知道它們正在使用的結構。您可以使用方法Result.getMap其返回Map[Family, Map[Qualifier, Map[CreateTime, Value]]]