2016-05-18 16 views
5

Ich habe einen DataFrame aus einer HBase-Tabelle (PHOENIX) mit 500 Millionen Zeilen erstellt. Aus dem DataFrame habe ich eine RDD von JavaBean erstellt und benutze sie für die Verknüpfung mit Daten aus einer Datei.PHOENIX SPARK - Tabelle als Datenrahmen laden

Jetzt meine Frage - Sagen wir, die Datei hat 2 einzigartige Millionen Einträge passend zu der Tabelle. Wird die gesamte Tabelle als RDD in den Speicher geladen oder werden nur die übereinstimmenden 2 Millionen Datensätze aus der Tabelle als RDD in den Speicher geladen?

+0

Hi @Mohan können Sie mir bitte die Build-Abhängigkeit für das 'DataFrame df = sqlContext.read(). Format ("org.apache.phoenix.spark"). Options (phoenixInfoMap) .load() 'Methode mitteilen . Ich mache das gleiche, bekomme aber 'java.lang.NoSuchMethodError' – Explorer

Antwort

2

Ihre Aussage

DataFrame df = sqlContext.read().format("org.apache.phoenix.spark").options(phoenixInfoMap) 
.load(); 

wird die gesamte Tabelle in den Speicher laden. Sie haben noch keinen Filter für phoenix bereitgestellt, um nach hbase zu drängen - und somit die Anzahl der gelesenen Zeilen zu reduzieren.

Wenn Sie eine Verbindung zu einer Nicht-HBase-Datenquelle - z. B. eine flache Datei - herstellen, müssen zuerst alle Datensätze aus der hbase-Tabelle eingelesen werden. Die Datensätze, die nicht der sekundären Datenquelle entsprechen, werden nicht gespeichert im neuen DataFrame - aber die erste Lesung wäre noch passiert.

Update Ein möglicher Ansatz wäre, die Datei vorzuverarbeiten - also die gewünschten IDs zu extrahieren. Speichern Sie die Ergebnisse in einer neuen HBase-Tabelle. Führen Sie dann den Join direkt in HBase über Phoenix nicht Spark.

Die Begründung für diesen Ansatz ist verschieben Sie die Berechnung auf die Daten. Der Großteil der Daten befindet sich in HBase - also verschieben Sie die kleinen Daten (IDs in den Dateien) dorthin.

Ich bin nicht direkt vertraut mit Phoenix, außer dass es eine SQL-Ebene auf HBase bietet. Vermutlich wäre es dann in der Lage, einen solchen Join durchzuführen und das Ergebnis in einer separaten HBase-Tabelle zu speichern. Diese separate Tabelle könnte dann in Spark geladen werden, um in Ihren nachfolgenden Berechnungen verwendet zu werden.

+0

Danke @javadba. Gibt es eine effiziente Möglichkeit, mit diesem Szenario umzugehen? Ich möchte nur die 2 Millionen übereinstimmenden Einträge in der Datei von HBase Tabelle laden. – Mohan

+0

Ich habe das OP aktualisiert, um dies zu beantworten. – javadba

Verwandte Themen