Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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

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中数据的有效分组_Scala_Apache Spark - Fatal编程技术网

Scala Spark中数据的有效分组

Scala Spark中数据的有效分组,scala,apache-spark,Scala,Apache Spark,我需要在Spark(Scala)中执行简单的数据分组。特别是,这是我的初始数据: 1, a, X 1, b, Y 2, a, Y 1, a, Y val seqs = Seq((1, "a", "X"),(1, "b", "Y"),(2, "a", "Y"),(1, "a", "Y")) 我需要按第一个键将其分组,如下所示: 1, (a, X), (b, Y), (a, Y) 2, (a, Y) 我最初的idia是使用DataFrame和groupBy,但我了解到这个操作非常昂贵,需要对所

我需要在Spark(Scala)中执行简单的数据分组。特别是,这是我的初始数据:

1, a, X
1, b, Y
2, a, Y
1, a, Y

val seqs = Seq((1, "a", "X"),(1, "b", "Y"),(2, "a", "Y"),(1, "a", "Y"))
我需要按第一个键将其分组,如下所示:

1, (a, X), (b, Y), (a, Y)
2, (a, Y)
我最初的idia是使用
DataFrame
groupBy
,但我了解到这个操作非常昂贵,需要对所有数据进行彻底的重组


那么,执行分组的成本较低的选项是什么?请举一个具体的例子。

您可以这样做:

  val rdd = sc.parallelize(List((1, "a", "X"),(1, "b", "Y"),(2, "a", "Y"),(1, "a", "Y")))
  val mapping = rdd.map(x=>(x._1,List((x._2,x._3))))
  val result = mapping.reduceByKey((x,y) => (x ++ y)) 
这使用了reduceByKey,但是所有reduce过程的问题是,每个组必须有一个键值对。因此,在本例中,您需要显式地将每个值转换为列表,以便reduce进程可以合并它们

你也可以考虑使用内部缩减过程

=======编辑======


正如zero323所指出的,reduce不会提高效率,相反,这个过程将失去groupByKey的优化

但groupBy正是您想要的—并行处理是spark的优势,所以您可以对RDD或Dataframe执行groupBy。另一种方法是使用Reduce,这样效率更高,但问题是最终每个组只剩下1个键值对。如果不进行洗牌,就无法跨分区分组。考虑一下物品需要放在哪里。它很贵,因为它一定很贵。谢谢。只是一个小问题(我可能在解释中遗漏了这个细节)。我的真实数据的格式是RDD[String]。所以我使用
val splitted=rdd.map(line=>line.split(“,”)
来获取特定的值,例如
1
a
X
。拆分的变量
的类型为
RDD[Array[String]]
。我应该如何将
reduceByKey
应用于
splitted
?@HackerDuck您需要通过case类或其他东西将字符串数组映射到(Int、String、String)结构中-通常通过case类映射它,因为在将其转换为数据帧时,它也充当模式(如果您愿意的话)。什么是
(x++y)
意思?顺便说一句,如果您添加一行代码来显示如何打印
结果
,在我的例子中是
RDD[(String,List[(String,String)]]
@HackerDuck
x++y
意味着将列表x与列表y合并,这在reduce操作的上下文中,意思是收集所有的值并将它们放在一个列表中-是的,您的结果将是key,List(值),这是groupby生成的。