使用没有整数列的 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 并行度

在不知道上限的情况下使用 spark 从 sql 数据库中并行读取

Python PySpark:从日期列中减去整数列错误:列对象不可调用

在 AWS EMR 上使用 Spark 访问关系数据库

从R中的整数列创建分类值列

spark学习之并行度并发core数和分区的关系