2016-05-17 16 views
2

Ich bin ein H2OFrame aus einer CSV-Datei zu lesen:Wie filtern Zeilen in H2OFrame (Scala) basierend auf einem Spaltenwert?

val h2oFrame = new H2OFrame(new File(inputCsvFilePath))

Wie kann ich ein Äquivalent eines .filter() Operation durchführen (wie verfügbar für Spark DataFrame oder RDD). Zum Beispiel, wie bekomme ich eine neue H2OFrame wo "Label" (was ist ein Spaltenname) ist >1?

Ich habe versucht, wie unten auf ein org.apache.spark.sql.DataFrame Umwandlung (vereinfachtes Beispiel):

val df = asDataFrame(h2oFrame) 
val dff = df.filter(s"label > 1") 
print(dff.toString(0,15)) 

Aber das scheint OutOfMemoryError wie unten zu werfen:

Ausnahme: java.lang.OutOfMemoryError vom geworfen UncaughtExceptionHandler im Thread "Executor Taskstart Worker-2"

+0

Okay, sieht aus wie die 'OutOfMemoryError' kann durch Erhöhung' -XX gelöst werden. Möchte immer noch eine Antwort auf die ursprüngliche Frage, wie man es direkt auf 'H2OFrame' macht. –

Antwort

0

Ich würde Ihnen empfehlen, dies zu tun so wie du bist - via Spark. Von der FAQ:

Wie filtere ich einen H2OFrame mit Sparkling Water?

Filtering Spalten ist einfach: nur die unnötigen Spalten entfernen oder eine neue> H2OFrame aus den Spalten erstellen Sie (Frame (String [] Namen, Vec [] VEC)) enthalten sein sollen, dann machen die H2OFrame Wrapper um ihn herum (neuer H2OFrame (Rahmen)).

Filtern von Zeilen ist ein bisschen schwieriger. Es gibt zwei Möglichkeiten:

Erstellen Sie einen zusätzlichen binären Vektor mit 1/0 für die In/Out-Probe (achten Sie darauf, diesen zusätzlichen Vektor in Ihren Berechnungen zu berücksichtigen). Diese Lösung ist ziemlich billig, da Sie nicht Daten duplizieren - einfach einen einfachen Vektor in einem Datenlauf erstellen.

oder

Erstellen Sie einen neuen Rahmen mit den gefilterten Zeilen. Dies ist eine schwierigere Aufgabe, , da Sie Daten kopieren müssen. höher MaxPermSize = 92m` etwas: Als Referenz, Blick auf die #deepSlice Anruf auf Frame (H2OFrame)