我想知道如何使用spark SQL来处理存储在关系数据库中的结构化大数据?我的表格包含超过40亿条线(GPS坐标)。在使用Merge操作时,Spark尝试处理内存中的整个表,这是不可能的。我知道Spark是"内存中"处理,但在我的情况下,内存无法容纳整个表。那么,当表很大时,有可能将spark用于关系数据库吗?
如果要读取的数据超过内存大小,Spark不会一次将整个数据集缓存到内存中。Spark文件指出:
Spark RDD持久性
Spark中最重要的功能之一是跨操作在内存中持久化(或缓存)数据集。当您持久化RDD时,每个节点都将其计算的任何分区存储在内存中,并在该数据集上的其他操作中重用它们
此外,还可以将存储级别提供为MEMORY_AND_DISK
MEMORY_AND_DISK:将RDD作为反序列化的Java对象存储在JVM中。如果RDD不适合内存,请将不适合磁盘的分区存储起来,并在需要时从中读取。
您使用的任何Spark数据结构都在内部使用RDD。
同样假设您使用JDBC连接到外部数据库,您可以指定属性fetchsize和batchsize
fetchsize:JDBC的fetchsize,它决定每次往返要提取多少行。这有助于JDBC驱动程序的性能,JDBC驱动程序默认为低获取大小(例如,具有10行的Oracle)。此选项仅适用于阅读。
batchsize:JDBC批大小,它决定每次往返要插入多少行。这有助于JDBC驱动程序的性能。此选项仅适用于书写。默认值为1000。
JDBC到其他数据库
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()