从两个不同的数据库加入RDD

时间:2016-10-15 02:12:02

标签: oracle jdbc apache-spark rdd

我正在尝试开发一个spark应用程序,它将从两个不同的Oracle数据库中获取数据并对其进行处理。

可能会加入我从两个数据库中提取的RDD来创建一个新的RDD。

我可以在一个spark应用程序中创建不同的数据库连接吗?

2 个答案:

答案 0 :(得分:2)

虽然我还没有通过以下方式测试,但您可以尝试这样的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()

答案 1 :(得分:1)

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