java - Spark 中 Oracle 表之间的联接

标签 java oracle apache-spark

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

谢谢!

最佳答案

在 Spark 中进行联接操作之前,您可以为 Oracle 和 Spark 中的联接查询创建一些性能矩阵,并根据观察来决定选择哪一个。几乎没有相同的分析指针,

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

希望这些指针有助于了解是否使用 Spark。

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

您可以通过任何一种方式为每个表创建数据帧并执行连接操作,然后在 Spark 内存中注册临时表并在其上执行 sql 查询,类似于 Oracle。 这样做并没有什么害处。另一种方法是为每个表创建数据集,并使用 join 函数执行 join 操作。 这里两种方法的结果是相同的,但从性能的角度来看,数据集更加优化,因为它将尝试利用 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")))

关于java - Spark 中 Oracle 表之间的联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61443434/

相关文章:

java - Dagger 组件有冲突的作用域

javascript - 使用 JxBrowser 监听页面变化

sql - 选择查询以获取与列中所有值对应的行

java - Android/google 无特定原因的 ANR 崩溃

带有静态泛型方法的java静态泛型hashmap

java - Apache Spark 对常规文件的行为

斯卡拉 Spark : Performance issue renaming huge number of columns

java - 当 main 方法什么都不做时,集群模式下的 Spark 提交失败

sql - 为什么比较 varchar/number 有效

java - 如何在 SYS.URITYPE 类型的 ORACLE 表列中存储数据