Извлечь данные из реляционной базы данных, используя Spark (параллельный) без целочисленного столбца? - PullRequest
0 голосов
/ 04 июля 2018

В документации по Databricks упоминается, что мы должны предоставлять значения 'partitionColumn, lowerBound, upperBound и numPartitions' при чтении данных из реляционной базы данных несколькими работниками. Также упоминается, что partitionColumn должен быть целочисленным столбцом. Как я могу затем выполнить параллельное чтение из таблицы, в которой нет целочисленного столбца?

Документация по базе данных

Я попытался использовать 'rownum' (источник - Oracle DB) в качестве столбца раздела, но когда я пытаюсь сохранить результаты в кадре данных, я получаю только данные из первого раздела.

Вот код:

jdbcUrl = "jdbc:oracle:thin:@//{0}:{1}/{2}".format(hostname, port, db)



connectionProperties = {
  "user" : 'XXXXXX',
  "password" : 'XXXXXX',
  "driver" : "oracle.jdbc.driver.OracleDriver",
  "oracle.jdbc.timezoneAsRegion" : "false"
}

parallel_df = spark.read.jdbc(url=jdbcUrl,
                          table=table_name, 
                          column='rownum', 
                          lowerBound=1, 
                          upperBound=200000, 
                          numPartitions=20,
                          properties=connectionProperties)

Когда я получаю количество параллельных файлов, я получаю только 200000/20 = 10000 строк. Кто-нибудь может рассказать о том, как выполнить параллельное чтение?

1 Ответ

0 голосов
/ 10 июля 2018

Когда я получаю количество параллельных файлов, я получаю только 200000/20 = 10000 строк. Может ли кто-нибудь дать представление о том, как выполнить параллельное чтение?

когда вы читаете фрейм данных таким образом (т.е. с разделениями), spark выполнит запрос для каждого раздела, в вашем случае что-то вроде

select t.* from table t where rownum between (1, 10000)  on executor 1
select t.* from table t where rownum between (10001, 20000) on execuotr 2

and so on ...

с точки зрения оракула запросы не связаны, и rownum (как обычно) всегда будет начинаться с 1, поэтому вы получите только первые 10000 строк, поступающих из первого запроса.

В документации Databricks упоминается, что мы должны предоставить значения 'partitionColumn, lowerBound, upperBound и numPartitions' при чтении данных из реляционной базы данных среди нескольких работников.

Верно, но вам не нужно это делать любой ценой. Если в ваших данных нет столбца, подходящего для разбиения / разделения данных, просто не используйте эту функцию

val df = spark.read.jdbc(url=jdbcUrl, table=table_name, properties=connectionProperties)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...