Databricks文档提到,在从多个工作人员的关系数据库中读取数据时,我们必须提供“ partitionColumn,lowerBound,upperBound和numPartitions”值。还提到了partitionColumn应该是整数列。然后如何从没有整数列的表中进行并行读取?
我尝试使用'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行。谁能提供关于如何并行读取的任何见识?
答案 0 :(得分:1)
当我得到parallel_df的计数时,我只有200000/20 = 10000 行。谁能提供关于如何并行读取的任何见识?
当您以这种方式(即带有partititons)读取数据帧时,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)