使用不带整数列的 Spark(并行)从关系数据库中提取数据?

Extract data from Relational database using Spark(parallel) without integer column?

Databricks 文档提到我们必须提供 'partitionColumn, lowerBound, upperBound and numPartitions' 值,同时跨多个 worker 从关系数据库读取数据。还提到 partitionColumn 应该是整数列。然后如何从没有整数列的 table 进行并行读取?

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 行。谁能提供有关如何执行此并行读取的任何见解?

When i get the count of parallel_df, i get only 200000/20 = 10000 rows. Can anyone provide any insight on how to do this parallel read?

当您以这种方式读取数据帧(即使用分区)时,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 documentation mentions that we have to provide 'partitionColumn, lowerBound, upperBound and numPartitions' values while reading data from a relational database across mulitple workers.

是的,但您不必不惜任何代价这样做。如果您的数据没有适合数据的列 partitioning/splitting 那么就不要使用该功能

val df = spark.read.jdbc(url=jdbcUrl, table=table_name, properties=connectionProperties)