【问题标题】:Extract data from Relational database using Spark(parallel) without integer column?使用没有整数列的 Spark(并行)从关系数据库中提取数据?
【发布时间】:2018-07-03 23:56:45
【问题描述】:

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

【问题讨论】:

标签: apache-spark databricks


【解决方案1】:

当我得到 parallel_df 的计数时,我只得到 200000/20 = 10000 行。谁能提供有关如何进行这种并行读取的任何见解?

当您以这种方式(即使用分区)读取数据帧时,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)只是 分布式数据 的抽象
猜你喜欢
  • 2021-03-08
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多