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