2016-05-17 5 views
2

Я читал H2OFrame из файла CSV:Как фильтровать строки в H2OFrame (scala) на основе значения столбца?

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

Как я могу выполнить эквивалент .filter() операции (как для Спарк DataFrame или RDD). Например, как мне получить новый H2OFrame, где «label» (который является именем столбца) является >1?

Я попытался преобразования в org.apache.spark.sql.DataFrame, как показано ниже (упрощенный пример):

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

Но это, кажется, бросить OutOfMemoryError, как показано ниже:

Исключение: java.lang.OutOfMemoryError выброшен из UncaughtExceptionHandler в потоке «Оператор запуска-работника-2»

+0

Хорошо, выглядит как 'OutOfMemoryError' может быть решена за счет увеличения' -XX: MaxPermSize = 92m' к чему-то высшему. По-прежнему хотелось бы ответить на исходный вопрос о том, как это сделать непосредственно на «H2OFrame». –

ответ

0

Я бы порекомендовал вам это сделать как вы - через Spark. От FAQ:

Как фильтровать H2OFrame с использованием игристой воды?

Фильтрация столбцов легко: просто удалить ненужные столбцы или создать новый> H2OFrame из колонок, которые вы хотите включить (Frame (String [] имена, Vec [] VEC)), затем делают H2OFrame обертка вокруг него (новый H2OFrame (рамка)).

Фильтрация строк немного сложнее. Возможны два способа:

Создайте дополнительный бинарный вектор, содержащий 1/0 для образца ввода/вывода (не забудьте взять этот дополнительный вектор в свои вычисления ). Это решение довольно дешево, так как вы не делаете дублирующиеся данные - просто создайте простой вектор в режиме обработки данных.

или

Создать новую рамку с отфильтрованных строк. Это сложнейшая задача: , так как вам нужно скопировать данные. Для справки, смотрите на #deepSlice вызова на раме (H2OFrame)