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

时间:2017-02-01 16:41:55

标签: sql apache-spark apache-spark-sql bigdata

我想知道如何使用spark SQL处理存储在关系数据库中的结构化大数据?我的表格包含超过40亿行(GPS坐标)。在使用Merge操作时,Spark会尝试处理内存中的整个表,这是不可能的。我知道Spark是“内存中”处理,但在我的情况下,内存不适合整个表。当表格很大时,是否可以在关系数据库中使用spark?

1 个答案:

答案 0 :(得分:2)

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

Spark RDD Persistence

  

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

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

  

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

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

另外假设您使用JDBC连接到外部数据库,您可以指定属性 fetchsize 批量大小

  

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

     

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()