检查RDD是否相等 - java

我在JUnit中进行了一些测试,我需要检查两个Spark RDD的相等性。

我想到的一种方法是:

JavaRDD<SomeClass> expResult = ...;
JavaRDD<SomeClass> result = ...;

assertEquals(expResult.collect(), result.collect());

有没有比这更好的方法了?

参考方案

如果预期结果相当小,则最好使用collect RDD数据并在本地进行比较(就像您编写的一样)。

当需要在测试中使用足够大的数据集时,几乎没有其他可能性:

免责声明:我对Spark Java API不够熟悉,因此我将在Scala中编写更多示例代码。我希望这不会成为问题,因为它可以用Java重写或转换为从Java代码调用的几个实用程序函数。

方法1:将RDD压缩在一起并逐项比较

仅当RDD中元素的顺序定义明确(即RDD已排序)时,此方法才可用。

val diff = expResult
  .zip(result)
  .collect { case (a, b) if a != b => a -> b }
  .take(100)

diff数组最多包含100个区分对。如果RDD足够大,并且您想从本地diff获取所有项目,则可以使用toLocalIterator方法。最好不要使用collect方法,因为您可以运行OOM。

此方法可能是最快的方法,因为它不需要改组,但是只有在RDD中的分区顺序和分区中的项目顺序定义明确的情况下,才可以使用此方法。

方法2:共同RDD

此方法可用于测试result RDD是否包含指定的(可能是非唯一的)值而没有任何特定顺序

  val diff = expResult.map(_ -> 1)
    .cogroup(result.map(_ -> 1))
    .collect { case (a, (i1, i2)) if i1.sum != i2.sum => a -> (i1.sum - i2.sum) }
    .take(100)

diff数组将包含差异值以及数量之间的差异。

例如:

  • 如果expResult包含某个值的单个实例,而result不包含该值,则数字为+1
  • 如果result包含3个其他值的实例,并且expResult仅包含1,则数字为-2
  • 此方法将比其他选项更快(即,彼此减去RDD),因为它只需要一次混洗即可。

    有效地将包含字母的字符串转换为Int-Apache Spark - java

    我正在使用将用户作为字符串的数据集(即B000GKXY4S)。我想将这些用户中的每一个都转换为int,因此可以在Apache Spark ALS中使用Rating(user:Int,product:Int,rating:Double)类。最有效的方法是什么?最好使用Spark Scala函数或python本机函数。 参考方案 如果只想将任何可匹配的Strin…

    Spark Java-合并同一列多行 - java

    我正在使用Java Spark,并且有1个这样的数据框+---+-----+------+ |id |color|datas | +----------------+ |1 |blue |data1| |1 |red |data2| |1 |orange|data3| |2 |black |data4| |2 | |data5| |2 |yellow| | …

    apache spark MLLib:如何为字符串特征建立标记点? - java

    我正在尝试使用Spark的MLLib构建NaiveBayes分类器,该分类器将一组文档作为输入。我想将一些东西作为特征(即作者,显式标签,隐式关键字,类别),但查看the documentation似乎LabeledPoint仅包含双精度字,即看起来像LabeledPoint[Double, List[Pair[Double,Double]]。相反,我从其余…

    Java:正则表达式模式匹配器是否有大小限制? - java

    我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

    Java:线程池如何将线程映射到可运行对象 - java

    试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …