当表很大时,是不是可以将 Spark SQL 与关系数据库一起使用?

Posted

技术标签:

【中文标题】当表很大时,是不是可以将 Spark SQL 与关系数据库一起使用?【英文标题】:Is it possible to use Spark SQL with relational databases when the tables are big?当表很大时,是否可以将 Spark SQL 与关系数据库一起使用? 【发布时间】:2017-02-01 16:41:54 【问题描述】:

我想知道我们如何使用 spark SQL 来处理存储在关系数据库中的结构化大数据?我的表格包含超过 40 亿条线(GPS 坐标)。在使用 Merge 操作时,Spark 会尝试处理内存中的整个表,这是不可能的。我知道 Spark 是“内存中”处理,但就我而言,内存无法容纳整个表。那么当表很大时,是否可以将 spark 与关系数据库一起使用?

【问题讨论】:

【参考方案1】:

如果要读取的数据超过内存大小,Spark 不会一次将整个数据集缓存到内存中。 Spark 文档指出:

Spark RDD Persistence

Spark 中最重要的功能之一是跨操作将数据集持久化(或缓存)在内存中。当你持久化一个 RDD 时,每个节点都会将它计算的任何分区存储在内存中,并在该数据集的其他操作中重用它们

另外,可以提供存储级别为 MEMORY_AND_DISK

MEMORY_AND_DISK :将 RDD 作为反序列化的 Java 对象存储在 JVM 中。如果 RDD 不适合内存,请将不适合的分区存储在磁盘上,并在需要时从那里读取它们。

您使用的任何 Spark 数据结构在内部都使用 RDD。

同样假设您使用 JDBC 连接外部数据库,您可以指定属性 fetchsizebatchsize

fetchsize :JDBC 提取大小,它确定每次往返要提取的行数。这有助于提高默认为低读取大小的 JDBC 驱动程序的性能(例如,具有 10 行的 Oracle)。此选项仅适用于阅读。

batchsize :JDBC 批处理大小,它决定每次往返插入多少行。这有助于提高 JDBC 驱动程序的性能。此选项仅适用于写作。默认为 1000。

JDBC To Other Databases

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:postgresql:dbserver")
  .option("dbtable", "schema.tablename")
  .option("user", "username")
  .option("password", "password")
  .option("fetchsize", "100")
  .load()

【讨论】:

以上是关于当表很大时,是不是可以将 Spark SQL 与关系数据库一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

当表名是参数时Oracle使用动态sql

当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?

spark的一些经验

当表具有指向自身的链接时的 SQL 查询

分库分表

Spark with Hive 是不是可以将项目阶段推送到 HiveTableScan?