Apache spark 使用Spark(并行)从关系数据库中提取数据,而不使用整数列?

Apache spark 使用Spark(并行)从关系数据库中提取数据,而不使用整数列?,apache-spark,databricks,Apache Spark,Databricks,Databricks文档提到,在跨多个Worker从关系数据库读取数据时,我们必须提供“partitionColumn、lowerBound、upperBound和numPartitions”值。还提到了partitionColumn应该是一个整数列。那个么,如何从并没有整数列的表中进行并行读取呢 我尝试使用“rownum”(源代码是oracledb)作为分区列,但当我尝试将结果存储在数据帧中时,我只从第一个分区获取数据 代码如下: jdbcUrl = "jdbc:oracle:thin:@/

Databricks文档提到,在跨多个Worker从关系数据库读取数据时,我们必须提供“partitionColumn、lowerBound、upperBound和numPartitions”值。还提到了partitionColumn应该是一个整数列。那个么,如何从并没有整数列的表中进行并行读取呢

我尝试使用“rownum”(源代码是oracledb)作为分区列,但当我尝试将结果存储在数据帧中时,我只从第一个分区获取数据

代码如下:

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行。有人能提供一些关于如何进行并行阅读的见解吗

当我得到并行_df的计数时,我只得到200000/20=10000 排。有人能提供一些关于如何进行并行阅读的见解吗

当您以这种方式读取数据帧(即使用partitions)时,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)只是分布式数据的抽象