使用没有整数列的 Spark(并行)从关系数据库中提取数据?
Posted
技术标签:
【中文标题】使用没有整数列的 Spark(并行)从关系数据库中提取数据?【英文标题】:Extract data from Relational database using Spark(parallel) without integer column? 【发布时间】:2018-07-03 23:56:45 【问题描述】:Databricks 文档提到,在跨多个工作人员从关系数据库读取数据时,我们必须提供“partitionColumn、lowerBound、upperBound 和 numPartitions”值。还提到partitionColumn应该是一个整数列。然后如何从没有整数列的表中进行并行读取?
Databricks Documentation
我尝试使用“rownum”(来源是 Oracle DB)作为分区列,但是当我尝试将结果存储在数据帧中时,我只从第一个分区获取数据。
代码如下:
jdbcUrl = "jdbc:oracle:thin:@//0:1/2".format(hostname, port, db)
connectionProperties =
"user" : 'XXXXXX',
"password" : 'XXXXXX',
"driver" : "oracle.jdbc.driver.OracleDriver",
"oracle.jdbc.timezoneAsRegion" : "false"
parallel_df = spark.read.jdbc(url=jdbcUrl,
table=table_name,
column='rownum',
lowerBound=1,
upperBound=200000,
numPartitions=20,
properties=connectionProperties)
当我得到 parallel_df 的计数时,我只得到 200000/20 = 10000 行。谁能提供有关如何执行此并行读取的任何见解?
【问题讨论】:
相关Pseudocolumn in Spark JDBC 您可以使用predicates
,但具体用法取决于数据。
【参考方案1】:
当我得到 parallel_df 的计数时,我只得到 200000/20 = 10000 行。谁能提供有关如何进行这种并行读取的任何见解?
当您以这种方式(即使用分区)读取数据帧时,spark 将对每个分区进行查询,在您的情况下类似于
select t.* from table t where rownum between (1, 10000) on executor 1
select t.* from table t where rownum between (10001, 20000) on execuotr 2
and so on ...
从 oracle 的角度来看,查询是不相关的,并且 rownum(像往常一样)总是从 1 开始,因此您只能从第一个查询中获得前 10000 行。
Databricks 文档提到我们必须提供 'partitionColumn、lowerBound、upperBound 和 numPartitions' 值 同时从多个工作人员的关系数据库中读取数据。
没错,但您不必不惜一切代价这样做。如果您的数据没有适合数据分区/拆分的列,则不要使用该功能
val df = spark.read.jdbc(url=jdbcUrl, table=table_name, properties=connectionProperties)
【讨论】:
谢谢@gtosto。有没有办法将所有分区放入一个数据框中?像聚合参数或类似参数? 您总是获取数据框中的所有分区。 Dataframe(和底层 RDD)只是 分布式数据 的抽象以上是关于使用没有整数列的 Spark(并行)从关系数据库中提取数据?的主要内容,如果未能解决你的问题,请参考以下文章
在不知道上限的情况下使用 spark 从 sql 数据库中并行读取