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 表之间的联接的主要内容,如果未能解决你的问题,请参考以下文章