【问题标题】:Spark execution using jdbc使用 jdbc 执行 Spark
【发布时间】:2020-09-18 03:18:01
【问题描述】:

在 Spark 数据框中,假设我从 oracle 获取数据,如下所示。

查询会完全在 oracle 中进行吗?假设查询很大。那么它是甲骨文的开销吗?更好的方法是在单独的数据框中读取每个过滤后的表数据并使用 spark SQL 或数据框将其连接起来,以便在 Spark 中进行完整的连接?你能帮忙吗?

df = sqlContext.read.format('jdbc').options(
url="jdbc:mysql://foo.com:1111", 
dbtable="(SELECT * FROM abc,bcd.... where abc.id= bcd.id.....) AS table1",      user="test",
password="******", 
driver="com.mysql.jdbc.Driver").load()

【问题讨论】:

  • 我建议按照您在问题中提到的步骤对 oracle 和 spark 的查询性能进行基准测试。性能因各种因素而异,例如记录数量、查询或连接的复杂程度等等,因此这个问题的回答范围很广。

标签: oracle scala performance dataframe apache-spark


【解决方案1】:

一般来说,实际的数据移动是最耗时的,应该避免。因此,作为一般规则,您希望在将数据移动到 Spark 环境之前尽可能多地在 JDBC 源(在您的情况下为 Oracle)中进行过滤。

一旦您准备好在 Spark 中进行一些分析,您可以持久化(缓存)结果,以避免每次都从 Oracle 重新检索。

话虽如此,@shrey-jakhmola 是对的,您想针对您的特定情况进行基准测试。 Oracle 环境是否以某种方式阻塞?

【讨论】:

  • 非常感谢。我正在为一个小型 POC 尝试这种情况。没有在实际项目中使用它。在写上面的代码时有疑问,无法从任何文章中看到答案。
  • 如果我们在oracle中进行复杂查询的join,在oracle中将是一个代价高昂的操作。因此,如果我将每个相关的表数据(例如:1. select * from emp where status = 'S', 2. select * from dept where dept_no=2 without join with other tables)分离数据帧并在 spark 中执行 join,如您在上面说过,在数据移动过程中会更耗时。由于上述两种方法都存在一些问题,最好将所有需要的表数据作为特定文件格式转储到 hdfs,并且 spark 可以直接从 hdfs 读取并处理。这会是一个好方法吗?
  • Oracle 非常擅长解决复杂的查询。您必须针对您的场景进行基准测试,但我的猜测是,在实际场景中,您需要在 Oracle 中进行连接。
  • 我知道 Oracle 可以很好地处理这个问题。但是感觉宁愿在Oracle中做这个处理,我们可以在spark中做join,这样我们就可以使用spark的完整处理能力?如果我们使用 RDBMS 来处理这个复杂的查询,那么 spark 需要做的处理就更少了。
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 2023-03-15
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多