Spark 中的 Oracle 表之间的联接

Posted

技术标签:

【中文标题】Spark 中的 Oracle 表之间的联接【英文标题】:Join between Oracle tables in Spark 【发布时间】:2020-04-26 15:33:53 【问题描述】:

我需要在 2 个 Oracle 表之间进行连接,然后通过 Spark(Java 中)处理数据。 这样做的最佳选择是什么? - 利用本机 Oracle 连接功能,通过“select * from table1,table2 where table1.fk = table2.pk”之类的查询在 Spark 中加载单个数据集 或者 - 利用 Spark 连接功能加载 2 个不同的数据集(每个 Oracle 表一个),然后通过 Dataset 函数 Dataset.join 执行连接?

谢谢!

【问题讨论】:

【参考方案1】:

在spark中做join操作之前,可以先在oracle和spark中创建一些join查询的性能矩阵,根据观察决定选择哪一个。对相同的分析的几个指针,

    如果数据集的大小和加入操作不会在 oracle DB 中增加性能问题,则在源(oracle)本身中执行加入操作。 但是当数据集足够大意味着以 GB 或 TB 为单位时,如果查询在 oracle 上运行时遇到性能问题,如果需要数小时来执行操作,那么您肯定必须考虑使用 spark,因为与 RDBMS 相比,它的查询延迟更短(甲骨文)。 如果 oracle DB 是事务数据库,并且有大量针对生产关键应用程序运行的事务查询,则需要分析连接操作是否阻塞数据库。如果这是问题,那么肯定会考虑在 spark 中卸载此数据集并在那里执行连接操作。 在 oracle 和 spark 中进行性能评估,并检查哪个加入操作更快。这里 oracle 可能比 spark 更快,如果数据大小很小,就像 spark 在内存中一样,但查询延迟在几秒到几分钟而不是在亚秒级。 如果将来连接表的数据持续增长并且这是重复批处理作业的一部分,那么您可能不希望每次都在源连接操作并使其负担过重。如果组织中有可用的 spark,那么我们可以将此类操作卸载到 spark。

希望这些提示有助于了解是否使用 spark。

在这里,我将保留以下答案,供您在火花选项之间进行选择。

您可以通过任何一种方式为每个表创建数据帧并执行连接操作,然后在 spark 内存中注册临时表并在其上执行 sql 查询,类似于 oracle。 这样做没有坏处。另一种方法是为每个表创建数据集并使用连接函数执行连接操作。 这里两种方法的结果是相同的,但从性能的角度来看,数据集更加优化,因为它会尝试利用 rdd 函数的额外优势,与仅 spark 数据帧相比更加优化。

以下是数据集操作的示例代码,

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

【讨论】:

你好阿亚,谢谢你的回答!但我的问题不是在 Spark 中加入的不同方式之间,而是我在问是通过 Spark 加入还是从已经加入的 Oracle 中提取数据更好(因此利用 Oracle 加入)......你怎么看?什么是最好的表演?感谢您的帮助! 嘿,它的 Ajay :) ...抱歉,让我在这里添加更多内容来回答您的问题。 对不起 AjaY :) 谢谢你的友好回答祝你有美好的一天

以上是关于Spark 中的 Oracle 表之间的联接的主要内容,如果未能解决你的问题,请参考以下文章

Oracle View 与 Oracle 中的联接表

如何使用 Spark sql 在 Databricks 中使用内部联接更新 Databricks Delta 表

列结果略有不同时的 SQL (Oracle) 联接

SQL Server 中的 Oracle 样式联接

Oracle 存储函数与查询中的联接

Spark表联接-资源分配问题