当表很大时,是不是可以将 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 连接外部数据库,您可以指定属性 fetchsize 和 batchsize
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 与关系数据库一起使用?的主要内容,如果未能解决你的问题,请参考以下文章