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

Я читаю H2OFrame из файла CSV:

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

Как я могу выполнить эквивалент операции .filter() (доступной для Spark DataFrame или RDD). Например, как мне получить новый H2OFrame, где "метка" (имя столбца) равна >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»


person S.P.    schedule 17.05.2016    source источник
comment
Хорошо, похоже, что OutOfMemoryError можно решить, увеличив -XX:MaxPermSize=92m до большего значения. Еще хотелось бы получить ответ на изначальный вопрос, как это сделать прямо на H2OFrame.   -  person S.P.    schedule 18.05.2016


Ответы (1)


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

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

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

Фильтровать строки немного сложнее. Есть два способа:

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

or

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

person Mateusz Dymczyk    schedule 12.07.2016