使用无整数列的Spark(parallel)从关系数据库中提取数据?

时间:2018-07-03 23:56:46

标签: apache-spark databricks

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

1 个答案:

答案 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)