连接来自两个不同数据库的 RDD

Posted

技术标签:

【中文标题】连接来自两个不同数据库的 RDD【英文标题】:Joining RDDs from two different databases 【发布时间】:2016-10-15 02:12:01 【问题描述】:

我正在尝试开发一个 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

数据库 2:

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

Now join (broadcast 是暗示它的小数据集可以进行broadcast hash join):

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

empDepartments.explain(true)
empDepartments.show()

【讨论】:

【参考方案2】:

RDD(或现在的数据框)是一个抽象层,其中所有数据似乎都具有相似的格式,而与底层数据源无关。

因此,一旦您将数据加载到数据框中,您应该能够按原样使用它。

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")

【讨论】:

以上是关于连接来自两个不同数据库的 RDD的主要内容,如果未能解决你的问题,请参考以下文章

计算来自 RDD 的不同用户

连接来自不同数据库的两个表

使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

连接来自两个不同来源的两个数据帧。如果数据框丢失,则无法处理情况

连接来自两个不同数据库的 3 个表?

连接来自两个不同数据库的表