2016-08-02 14 views
1

Ich möchte HBase Daten in einem Spark-Stream-Code zum Nachschlagen und weitere Verbesserung der Streaming-Daten lesen. Ich benutze spark-hbase-connector_2.10-1.0.3.jar.HBase in Scala lesen - it.nerdammer

In meinem Code die folgende Zeile erfolgreich

val docRdd = 
    sc.hbaseTable[(Option[String], Option[String])]("hbase_customer_profile") 
    .select("id","gender").inColumnFamily("data") 

docRdd.count die richtige Anzahl zurückgibt.

docRdd ist vom Typ

HBaseReaderBuilder (org.apache.spark.SparkContext @ 3a49e5, hbase_customer_profile, einige (Daten), WrappedArray (id, Geschlecht), None, None, List())

Wie kann ich alle Zeilen in id, gender Spalten bitte lesen. Wie kann ich auch docRdd in einen Datenrahmen konvertieren, so dass SparkSQL verwendet werden kann.

Antwort

1

Sie können alle Zeilen aus der RDD lesen mit

docRdd.collect().foreach(println) 

Um die RDD zu einem DataFrame umwandeln können Sie eine Fallklasse definieren:

case class Customer(rowKey: String, id: Option[String], gender: Option[String]) 

ich den Zeilenschlüssel hinzugefügt haben zur Fallklasse; das ist nicht unbedingt notwendig, also wenn Sie es nicht brauchen, können Sie es weglassen.

Dann map über die RDD:

// Row key, id, gender 
type Record = (String, Option[String], Option[String]) 

val rdd = 
    sc.hbaseTable[Record]("customers") 
    .select("id","gender") 
    .inColumnFamily("data") 
    .map(r => Customer(r._1, r._2, r._3)) 

und dann - auf den Fall Klasse basiert - konvertiert die RDD zu einem DataFrame

import sqlContext.implicits._ 
val df = rdd.toDF() 
df.show() 
df.printSchema() 

Die Ausgabe von spark-shell wie folgt aussieht:

scala> df.show() 
+---------+----+------+ 
| rowKey| id|gender| 
+---------+----+------+ 
|customer1| 1| null| 
|customer2|null|  f| 
|customer3| 3|  m| 
+---------+----+------+ 

scala> df.printSchema() 
root 
|-- rowKey: string (nullable = true) 
|-- id: string (nullable = true) 
|-- gender: string (nullable = true) 
+0

Danke @Beryllium. Ich werde das versuchen. Ich möchte die RDD in SparkStream verwenden. Ich hoffe, es ist auch serialisierbar. Nochmals vielen Dank für die Hilfe –

+0

Brauchen Sie Hilfe bei dieser Frage? – Beryllium

+0

Ich bin ganz auf diesen hier eingestellt. Vielen Dank.. –