У меня очень простая настройка SparkSQL для подключения к базе данных Postgres, и я пытаюсь получить DataFrame из таблицы DataFrame с числом X разделов (скажем 2). Код будет выглядеть следующим образом:SparkSQL PostgresQL разделов Dataframe
Map<String, String> options = new HashMap<String, String>();
options.put("url", DB_URL);
options.put("driver", POSTGRES_DRIVER);
options.put("dbtable", "select ID, OTHER from TABLE limit 1000");
options.put("partitionColumn", "ID");
options.put("lowerBound", "100");
options.put("upperBound", "500");
options.put("numPartitions","2");
DataFrame housingDataFrame = sqlContext.read().format("jdbc").options(options).load();
По какой-то причине один раздел DataFrame содержит почти все строки.
Для того, что я могу понять, lowerBound/upperBound
- это параметры, используемые для этого. В документации SparkSQL (Spark 1.4.0 - spark-sql_2.11) говорится, что они используются для определения шага, а не для фильтрации/диапазона столбца раздела. Но это вызывает несколько вопросов:
- Штраем является частота (количество элементов, возвращаемых каждым запросом), с которыми Spark будет запрашивать БД для каждого исполнителя (раздела)?
- Если нет, какова цель этих параметров, от чего они зависят и как я могу стабильно сбалансировать разделы DataFrame (не спрашивая, что все разделы содержат одинаковое количество элементов, просто есть равновесие - например, 2 перегородки 100 элементов 55/45, 60/40 или даже 65/35)
Не может показаться, что я нашел ответ на эти вопросы, и мне было интересно, может быть, некоторые из вас могут очистить это указывает на меня, потому что прямо сейчас влияет на производительность моего кластера при обработке X миллионов строк, и весь тяжелый подъем переходит к одному исполнителю.
Приветствия и благодарности за ваше время.