Объединить Oracle таблиц в Spark - PullRequest
0 голосов
/ 26 апреля 2020

Мне нужно сделать соединение между 2 Oracle таблицами и затем обработать данные через Spark (в Java). Каков наилучший вариант для этого? - Использовать встроенную возможность объединения Oracle и, таким образом, загрузить один набор данных в Spark с помощью запроса типа "select * from table1, table2, где table1.fk = table2.pk" ИЛИ - Использовать функции объединения Spark, загружая 2 разных набора данных (один для каждой таблицы Oracle), а затем выполните объединение с помощью функции набора данных Dataset.join?

спасибо!

1 Ответ

1 голос
/ 26 апреля 2020

Перед выполнением операции соединения в spark вы можете создать некоторую матрицу производительности для запроса соединения в oracle и спарк, основываясь на наблюдениях и решить, какой из них выбрать. Несколько указателей для анализа на одном и том же,

  1. Если набор данных достаточно большой по размеру и операция объединения не добавит проблем с производительностью в oracle БД, тогда выполните операцию соединения в самом источнике (oracle).
  2. Но когда набор данных достаточно большой, это означает, что в ГБ или ТБ и если у запроса есть проблемы с производительностью при выполнении на oracle, если для выполнения операции требуются часы, то определенно вам следует подумать об использовании spark в качестве задержки запроса. меньше по сравнению с RDBMS (oracle).
  3. Если oracle DB является базой данных транзакций и выполняется множество запросов транзакций для критически важного производственного приложения, необходимо проанализировать, блокирует ли операция присоединения базу данных или нет. Если это проблема, тогда определенно подумайте о разгрузке этого набора данных в spark и выполните там операцию соединения.
  4. Выполните оценку производительности в oracle, а также спарк и проверьте, какой из них быстрее выполняет операцию соединения. Здесь oracle может быть быстрее по сравнению со спарком, если размер данных небольшой, как будто искра находится в памяти, но задержка запроса составляет от секунд до минут, а не до секунд.
  5. Если данные для таблиц объединения в будущем будут расти и это является частью периодического пакетного задания, тогда вы можете не захотеть присоединяться к операции каждый раз в источнике и перегрузить ее. Если в организации есть искра, то мы можем разгрузить такие операции для зажигания.

Надеюсь, эти указатели помогут понять, будет ли go с искрой или нет.

Здесь я оставлю свой ответ ниже, чтобы вы могли выбрать один из вариантов искры.

Вы можете сделать это любым способом: создать фрейм данных для каждой таблицы, выполнить операцию соединения и после регистрации временной таблицы в искровой памяти и выполнить sql запросов поверх нее, аналогично oracle. Делать это не вредно. Другой способ - создать набор данных для каждой таблицы и выполнить операцию соединения, используя функцию соединения. Здесь результаты обоих подходов будут одинаковыми, но с точки зрения производительности наборы данных будут более оптимизированы, поскольку он попытается воспользоваться дополнительным преимуществом функции rdd, которая более оптимизирована по сравнению только с кадром искровых данных.

Ниже приведен пример кода для работы с набором данных,

Dataset<Row> jdbcDF1 = spark.read()
  .format("jdbc")
  .option("url", "oracle.jdbc.driver.OracleDriver")
  .option("dbtable", "schema.table1")
  .option("user", "username")
  .option("password", "password")
  .load();

Dataset<Row> jdbcDF2 = spark.read()
  .format("jdbc")
  .option("url", "oracle.jdbc.driver.OracleDriver")
  .option("dbtable", "schema.table2")
  .option("user", "username")
  .option("password", "password")
  .load();

jdbcDF1.join(jdbcDF1, jdbcDF1.col("id").equalTo(jdbcDF2.col("id")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...