Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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 对集合中的每个项运行函数_Scala_Apache Spark - Fatal编程技术网

Scala 对集合中的每个项运行函数

Scala 对集合中的每个项运行函数,scala,apache-spark,Scala,Apache Spark,我有以下数据类型: counted: org.apache.spark.rdd.RDD[(String, Seq[(String, Int)])] = MapPartitionsRDD[24] at groupByKey at <console>:28 因此,每个序列相互比较,并应用一个函数。为简单起见,函数只返回2。尝试上述功能时,我收到以下错误: scala> counted.flatMap { x => counted.map { y => ((x._1+"

我有以下数据类型:

counted: org.apache.spark.rdd.RDD[(String, Seq[(String, Int)])] = MapPartitionsRDD[24] at groupByKey at <console>:28
因此,每个序列相互比较,并应用一个函数。为简单起见,函数只返回2。尝试上述功能时,我收到以下错误:

scala> counted.flatMap { x => counted.map { y => ((x._1+","+y._1),func) } }
<console>:33: error: type mismatch;
 found   : org.apache.spark.rdd.RDD[(String, Int)]
 required: TraversableOnce[?]
              counted.flatMap { x => counted.map { y => ((x._1+","+y._1),func) } }
它将集合转换为数组类型并应用相同的函数。但是当我尝试这个方法时,我的内存用完了。我认为使用RDD比使用阵列更有效?我可以分配的最大内存量是7g,spark中是否有一种机制可以使用硬盘内存来增加可用的RAM内存


我正在运行此函数的集合包含20000个条目,因此有20000^2个比较(400000000),但用Spark术语来说,这相当小?

@RexKerr指出我在评论部分有点不正确,所以我删除了我的评论。但是当我这么做的时候,我有机会再次阅读了这篇文章,并想出了一个可能对你有用的想法

由于您试图实现的实际上是对笛卡尔乘积的某种操作,因此您可能只想尝试调用
RDD#cartesian
。这是一个愚蠢的例子,但如果你能给出一些真实的代码,也许在这种情况下我也能做类似的事情:

// get collection with the type corresponding to the type in question:
val v1 = sc.parallelize(List("q"-> (".", 0), "s"->(".", 1), "f" -> (".", 2))).groupByKey
// try doing something
v1.cartesian(v1).map{x => (x._1._1+","+x._1._1, 2)}.foreach(println)
简短答复:

counted.cartesian(counted).map {
  case ((x, _), (y, _)) => (x + "," + y, func)
}
请使用模式匹配来提取嵌套元组的元组元素,以避免不可读的链式下划线表示法。对第二个元素使用
向读者显示这些值被忽略

如果
func
不使用第二个元素,那么更具可读性(可能更高效)的是:

val projected = counted.map(_._1)
projected.cartesian(projected).map(x => (x._1 + "," + x._2, func))
请注意,如果lambda符合单个语义行,则不需要大括号这是Scala中非常常见的错误

我想知道为什么您希望有这个笛卡尔积,通常有一些方法可以避免这样做,而且这些方法的可伸缩性要高得多。请说出你将如何处理这个笛卡尔产品,我将尝试找到一种可扩展的方法来做你想做的事情


最后一点请在操作符之间加空格

@RexKerr,你说得对,我删除了我的评论,觉得有点夸张。谢谢,使用笛卡尔似乎很懒,因为当我使用笛卡尔时,它会立即返回,但在笛卡尔生成的集合上运行任何函数仍在内存中挣扎。谢谢你提到笛卡尔function@blue-sky,你们的硬件特性和spark设置是什么?我已经更新了问题,并回答了上述问题。我想我将不得不使用分布式配置,因为我只使用一个实例
counted.cartesian(counted).map {
  case ((x, _), (y, _)) => (x + "," + y, func)
}
val projected = counted.map(_._1)
projected.cartesian(projected).map(x => (x._1 + "," + x._2, func))