зажечь OOM на простом чтении и записи - PullRequest
1 голос
/ 10 июля 2019

Я использую spark для чтения из таблицы postgres и вывода ее в облачное хранилище Google как json. Таблица довольно большая, много сотен ГБ. Код относительно прост (пожалуйста, смотрите ниже), но он не работает с OOM. Кажется, что спарк пытается прочитать всю таблицу в памяти, прежде чем начать писать. Это правда? Как я могу изменить поведение так, чтобы оно читало и записывало в потоковом режиме?

Спасибо.

SparkSession sparkSession = SparkSession
                .builder()
                .appName("01-Getting-Started")
                .getOrCreate();
Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", properties);
dataset.write().mode(SaveMode.Append).json("gs://some/path");

1 Ответ

1 голос
/ 11 июля 2019

Существует несколько перегруженных DataFrameReader.jdbc() методов, которые полезны для разделения данных JDBC на входе.

jdbc (строковый URL, строковая таблица, предикаты String [], java.util.Properties connectionProperties) - результирующий DataFrame будет иметь один раздел для каждого заданного предиката, например,

String[] preds = {“state=‘Alabama’”, “state=‘Alaska’”, “state=‘Arkansas’”, …};
Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", preds, properties);

jdbc (String url, String table, String columnName, long lowerBound, long upperBound, int numPartitions, java.util.Properties connectionProperties) - Spark разделит данные на основе числового столбца columnName в numPartitions разделы между lowerBound и upperBound включительно, например:

Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", “<idColumn>”, 1, 1000, 100, properties);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...