Я работаю в кластере Spark 2.3 из 5 узлов, каждый из которых имеет 12 ГБ доступной памяти, и пытаюсь работать с набором данных Parquet размером около 130 ГБ, поверх которого я создал секционированную внешнюю таблицу Hive.
Допустим, я хотел бы знать количество записей в наборе данных.Сначала я предполагал, что Spark будет читать раздел данных по разделам, агрегировать текущий раздел, чтобы получить количество записей, передавать результат драйверу, а затем отбрасывать этот раздел, чтобы прочитать следующий.Однако, либо это не так (скорее, Spark сначала пытается прочитать все в памяти), либо я неправильно его кодирую.
Глупый подход, такой как sql("select count(*) from myhivetable")
, не работает: задание завершается с ошибкой пространства кучи Java.sql("select * from myhivetable").count()
(я думаю, они все равно скомпилированы в один и тот же план выполнения).
Я мог бы потенциально забыть о таблице кустов, использовать API файловой системы, чтобы получить список файлов, составляющих эту таблицу, и сделать записиподсчет файла за файлом, суммирование суммы в результате, например, fileList.foldLeft{ (recCount, file) => file.read(parquet).count + recCount}
- однако, а) этот метод может не "масштабироваться" для других возможных вариантов использования, б) я все еще думаю, что должен быть более элегантныйспособ сделать это просто с помощью набора инструментов Spark.Я не вижу этого?