我想知道如何使用spark SQL处理存储在关系数据库中的结构化大数据?我的表格包含超过40亿行(GPS坐标)。在使用Merge操作时,Spark会尝试处理内存中的整个表,这是不可能的。我知道Spark是“内存中”处理,但在我的情况下,内存不适合整个表。当表格很大时,是否可以在关系数据库中使用spark?
答案 0 :(得分:2)
如果要读取的数据超过内存大小,Spark不会将整个数据集一次性缓存到内存中。 Spark文档声明:
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。
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()