当前位置: 首页 > 知识库问答 >
问题:

Spark中Oracle表之间的连接

曾华翰
2023-03-14

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

谢谢你!

共有1个答案

通俊发
2023-03-14

在进行连接操作之前,您可以在Oracle和Spark中创建一些连接查询的性能矩阵,并根据观察结果决定选择哪一个。

  1. 如果数据集足够大,并且连接操作不会在oracle数据库中增加性能问题,那么在源(oracle)中执行连接操作
  2. 但是,如果数据集足够大(以GBs或TBs为单位),并且查询在oracle上运行时存在性能问题(如果需要数小时来执行操作),那么您肯定必须考虑使用spark,因为它的查询延迟比RDBMS(oracle)要少
  3. 如果oracle DB是事务数据库,并且有大量事务查询在为生产关键型应用程序运行,那么需要分析联接操作是否阻塞数据库。如果这就是问题所在,那么一定要考虑在spark中卸载这个数据集,并在那里执行连接操作
  4. 在oracle和spark中进行性能评估,并检查哪一个加入操作更快。在这里,如果数据大小很小,就像spark在内存中一样,但查询延迟在几秒钟到几分钟内,而不是几秒钟内,oracle可能比spark更快
  5. 如果将来联接表的数据持续增长,并且这是周期性批处理作业的一部分,那么您可能不希望每次在源位置联接操作,从而使其负担过重。如果组织中有可用的spark,那么我们可以将此类操作转移给spark

希望这些建议对理解是否使用spark有所帮助。

在这里,我将保留下面的答案,供您在spark选项中进行选择。

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

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

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 组件之间的网络连接问题会导致各式各样的警告/错误: SparkContext <-> Spark Standalone Master: 如果 SparkContext 不能连接到 Spark standalone master,会显示下面的错误 ERROR AppClient$ClientActor: All masters are unresponsive! Giving up. E

  • 本文向大家介绍Oracle中的Oracle Golden Gate和Oracle Active Guard之间的区别,包括了Oracle中的Oracle Golden Gate和Oracle Active Guard之间的区别的使用技巧和注意事项,需要的朋友参考一下 Oracle Golden Gate和Oracle Active Data Guard是数据复制技术。它们都用于数据复制,但是策略不

  • 我来自Java背景,刚接触Scala。 我正在使用Scala和Spark。但是我不明白我在哪里使用和。 有人能告诉我在哪种情况下我需要使用这两个操作符吗?和之间有什么区别吗?

  • 问题内容: 我有一个列表,我想找到连续元素之间的区别: 您将如何编码find_diff()函数?我可以使用“ for”迭代器对此进行编码,但是我敢肯定,有一种非常简单的方法可以使用一个简单的内衬进行编码。 问题答案: 您可以利用,并列出理解: 在性能方面,似乎并没有太大的差异:

  • 我想从两个表中删除相关的行。可能有外键,也可能没有。因此,可以肯定的是,我不想依赖外键及其在DELETE上的

  • 得到一些问题与桌子布线。我需要为每个用户uniq购物车,在那里我将存储书籍。 当我在DB中打开AppUser表时,“cart_id”列始终为NULL。 购物车表只有id列-不确定是否应该这样 谢谢! 购物车