我可以使用 `rownum` 来优化 apache spark 读取 oracle 表吗? [复制]

Posted

技术标签:

【中文标题】我可以使用 `rownum` 来优化 apache spark 读取 oracle 表吗? [复制]【英文标题】:Can I use `rownum` to optimize the apache spark reading oracle table? [duplicate] 【发布时间】:2018-09-21 01:48:32 【问题描述】:

我想使用 Spark 从 Oracle 表中读取所有记录。

此表假定总共有 10,000,000 条记录。

下面的优化可行吗?

val table = spark.read
  .format("jdbc")
  .option("driver", "oracle.jdbc.driver.OracleDriver")
  .option("url", "jdbc:oracle:thin:@ip:1521:dbname")
  .option("user", "")
  .option("password", "")
  .option("dbtable", s"(select a.*, ROWNUM rownum__rn from tbname a) b")
  .option("fetchsize", 100000)
  .option("partitionColumn", "rownum__rn")
  .option("lowerBound", 0)
  .option("upperBound", 10000000)
  .option("numPartitions", 10)
  .load()
  .drop("rownum__rn")

想知道上面代码得到的DataFrame是否与表中的记录一一对应, 即没有重复和遗漏。

如果上面的优化可行,是不是意味着多次执行下面的语句会以相同的顺序返回数据?

select a.*, ROWNUM rownum__rn from tbname a

版本:

0racle 发布 11.2.0.4.0 Spark 2.3.0

【问题讨论】:

我相信简短的回答是“不”。推荐阅读:blogs.oracle.com/oraclemagazine/on-rownum-and-limiting-results 你的表有唯一键/主键吗? @KaushikNayak 是的,有一个主键。 【参考方案1】:

不,您不能依赖该假设,因为没有ORDER BY 的查询可能,但也可能(并且可能)不会以相同的顺序返回行,尤其是对于 1000 万行。

要么包含ORDER BY 子句,要么 - 如果您对某些“行号”感兴趣,请使用

select row_number() over (order by deptno, hiredate desc) rn, 
  dname, loc, ename, job, sal
from your_table

(列名没有意义,我只是想告诉如何这样做)。

另外,获取 1000 万行 - 您打算如何处理这么多行?您可能不会将它们展示给最终用户,对吗?只是好奇。

【讨论】:

【参考方案2】:

1000 万行 - 为什么保持这么多行的顺序很重要。我认为任何应用程序都不会编写一个希望所有 1000 万行都按特定顺序排列的逻辑。 Spark 从底层数据存储中的分区读取数据。现在,spark 中的读取操作是并行操作,如果在内存中创建一个分区,则应用程序处理逻辑将启动,它不会等待所有负载发生。这是将数据异步加载到内存。

一旦数据被加载到内存中,你也可以考虑使用coalesce函数或者repartition函数来得到带有spark内存的partition数量。

【讨论】:

以上是关于我可以使用 `rownum` 来优化 apache spark 读取 oracle 表吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache Impala 中实现 Oracle 的 rownum()

将 BULK COLLECT 与 rownum 一起使用

Mysql 增加rownum

MySQL巧用自定义函数进行查询优化

我可以在表的选择语句(sqlplus)中使用 ROWNUM < SEQUENCE.NEXTVAL 吗?

oracle rownum 注意事项