我可以使用 `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()