我比较两个表以找出它们之间的差异(即源和目标),因为我将这些表加载到内存中,并且在配置8GB内存和4个核心,但在比较大量数据时,系统挂起并耗尽内存,因此我使用了persist()
storagelevel DISK_ONLY
该机器能够在内存中保存100,000行,一次将其存储到DISK
并进行其余的比较操作,我尝试如下:
var partition = math.ceil(c / 100000.toFloat).toInt
println(partition + " partition")
var a = 1
var data = spark.sparkContext.parallelize(Seq(""))
var offset = 0
for (s <- a to partition) {
val query = "(select * from destination LIMIT 100000 OFFSET " + offset + ") as src"
data = data.union(spark.read.jdbc(url, query, connectionProperties).rdd.map(_.mkString(","))).persist(StorageLevel.DISK_ONLY)
offset += 100000
}
val dest = data.collect.toArray
val s = spark.sparkContext.parallelize(dest, 1).persist(StorageLevel.DISK_ONLY)
是的,当然我可以使用分区,但问题是我需要动态提供Lowerbounds
,Upperbounds
,NumPartitions
以获取100,000
我尝试过:
val destination = spark.read.options(options).jdbc(options("url"), options("dbtable"), "EMPLOYEE_ID", 1, 22, 21, new java.util.Properties()).rdd.map(_.mkString(","))
它需要花费太多时间并将这些文件存储到分区中,尽管比较操作本质上是迭代的,它会读取每个步骤的所有分区。
来到问题
val dest = data.collect.toArray
val s = spark.sparkContext.parallelize(dest, 1).persist(StorageLevel.DISK_ONLY)
上面的行将所有已分区的RDD转换为Array并将其并行化为单个分区,因此我不想一次又一次地遍历所有分区。但由于内存不足,val dest = data.collect.toArray
无法转换大量的行,并且似乎不允许Persist()
数组出现火花。
我是否可以在DISK
中存储和并行化到一个分区
抱歉是个菜鸟。
谢谢你......!