Объединение RDD из двух разных баз данных

#oracle #jdbc #apache-spark #rdd

#Oracle #jdbc #apache-spark #rdd

Вопрос:

Я пытаюсь разработать приложение spark, которое будет получать данные из двух разных баз данных Oracle и работать с ними.

Могут быть такие вещи, как объединение RDD, которые я извлек из двух баз данных для создания нового RDD.

Могу ли я создавать разные подключения к базе данных внутри одного приложения Spark?

Ответ №1:

вы можете попробовать что-то вроде этого, который является DataFrame подходом, хотя я не тестировал приведенное ниже.

База данных 1 :

 val employees = sqlContext.load("jdbc", 
 Map("url" -> "jdbc:oracle:thin:hr/hr@//localhost:1521/database1", 
"dbtable" -> "hr.employees"))
employees.printschema
 

Dabase 2 :

 val departments  = sqlContext.load("jdbc", 
Map("url" -> "jdbc:oracle:thin:hr/hr@//localhost:1521/database2", 
"dbtable" -> "hr.departments"))
departments.printschema()
 

Теперь присоединяйтесь (широковещательная рассылка указывает на то, что у него небольшой набор данных и он может выполнять хэш-соединение с широким приведением):

 val empDepartments = employees.join(broadcast(departments), 
        employees("DEPARTMENT_ID")===
        departments("DEPARTMENT_ID"), "inner")
empDepartments.printSchema()

empDepartments.explain(true)
empDepartments.show()
 

Ответ №2:

RDD (или теперь dataframe) — это уровень абстракции, где все данные имеют одинаковый формат, независимо от базового источника данных.

Поэтому, как только вы загрузите свои данные в dataframe, вы сможете использовать их как есть.

 sqlContext.read.format("com.databricks.spark.avro").load("somepath").registerTempTable("avro_data")

sqlContext.read.format("parquet").load("someotjerpath").registerTempTable("parquet_data")

sqlContext.read.format("com.databricks.spark.redshift").option("url", jdbcConnectionString).option("query", query).load.registerTempTable("redshift_data")`
 

и затем уметь делать:

 sqlContext.sql("select * from avro_data a left join parquet_data p on a.key = b.key left join redshift_data r on r.key=a.key")