Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:将RDD元素拆分为块_Scala_Apache Spark_Apache Spark Mllib_Chunks - Fatal编程技术网

Scala Spark:将RDD元素拆分为块

Scala Spark:将RDD元素拆分为块,scala,apache-spark,apache-spark-mllib,chunks,Scala,Apache Spark,Apache Spark Mllib,Chunks,我在Scala中编写了一个相对简单的Spark作业,它从S3读取一些数据,执行一些转换和聚合,最后将结果存储到存储库中 在最后一个阶段,我有一个我的领域模型的RDD,我想把它们分成元素块,这样我就可以在我的存储库中进行一些大规模插入 我使用了RDDFunctions.slidering方法来实现这一点,它几乎可以正常工作。以下是我的代码的简化版本: val processedElements: RDD[DomainModel] = _ RDDFunctions.fromRDD(processed

我在Scala中编写了一个相对简单的Spark作业,它从S3读取一些数据,执行一些转换和聚合,最后将结果存储到存储库中

在最后一个阶段,我有一个我的领域模型的RDD,我想把它们分成元素块,这样我就可以在我的存储库中进行一些大规模插入

我使用了
RDDFunctions.slidering
方法来实现这一点,它几乎可以正常工作。以下是我的代码的简化版本:

val processedElements: RDD[DomainModel] = _
RDDFunctions.fromRDD(processedElements)
    .sliding(500, 500)
    .foreach { elementsChunk =>
        Await.ready(repository.bulkInsert(elementsChunk), 1.minute)
    }
问题是,例如,如果我有1020个元素,那么我的存储库中最终只有1000个元素。如果窗口大小大于剩余元素的数量,则滑动将忽略任何其他元素


有没有办法解决这个问题?如果没有,是否有其他方法可以在不使用
rdd函数的情况下实现相同的行为。滑动

您不能只使用
foreachPartition
和手动批处理管理吗

fromRDD.foreachPartition(items: Iterator[DomainModel] => {
   val batch = new ArrayBuffer[DomainModel](BATCH_SIZE)
   while (items.hasNext) {
     if (batch.size >= BATCH_SIZE) {
       bulkInsert(batch)
       batch.clear()
     }
     batch += items.next
   }
   if (!batch.isEmpty) {
      bulkInsert(batch)
   }
})

您是对的,Spark的
滑动
(与Scala的不同),会在窗口大小超过剩余项目数时生成一个空RDD。Spark也没有Scala的
分组
的等价物

如果您知道要创建多少组,一个可能适用的解决方法是使用
模过滤器拆分RDD。下面是一个将RDD分为5个组的简单示例:

val rdd = sc.parallelize(Seq(
  (0, "text0"), (1, "text1"), (2, "text2"), (3, "text2"), (4, "text2"), (5, "text5"),
  (6, "text6"), (7, "text7"), (8, "text8"), (9, "text9"), (10, "text10"), (11, "text11")
))

def g(n:Int)(x: Int): Boolean = { x % 5 == n }

val rddList = (0 to 4).map( n => rdd.filter(x => g(n)(x._1)) )

(0 to 4).foreach(n => rddList(n).collect.foreach(println))

(0,text0)
(5,text5)
(10,text10)

(1,text1)
(6,text6)
(11,text11)

(2,text2)
(7,text7)

(3,text2)
(8,text8)

(4,text2)
(9,text9)

我一开始就试过这样的方法。不幸的是,这导致了内存问题,因为我在内存中保存了很多东西。不幸的是,我不知道会有多少组。输入是不断变化的,所以每次我们可能会得到不同数量的组,而不是排序。