Scala 将groupByKey转换为reduceByKey
我了解到Scala 将groupByKey转换为reduceByKey,scala,apache-spark,spark-dataframe,rdd,Scala,Apache Spark,Spark Dataframe,Rdd,我了解到reducebyKey在大型数据集上是一个更好的选择,可以减少数据的混乱,从而提高性能 我正在尝试转换我对groupByKey的使用。首先,必须将其转换为rdd,如下所示: val linksNew = links.map(convertToRelationship) .flatMap(bidirRelationship) 链接是一个数据集,数据集api没有reduceByKey。使用reduceByKey时,与.groupByKey(u.\u 1)的等价物是什么 val link
reducebyKey
在大型数据集上是一个更好的选择,可以减少数据的混乱,从而提高性能
我正在尝试转换我对groupByKey
的使用。首先,必须将其转换为rdd,如下所示:
val linksNew = links.map(convertToRelationship)
.flatMap(bidirRelationship)
链接是一个数据集,数据集api没有reduceByKey
。使用reduceByKey
时,与.groupByKey(u.\u 1)
的等价物是什么
val linksfinal = linksNew.rdd.reduceByKey(???)
实际代码:
val biLinks = links
.map(convertToRelationship)
.flatMap(bidirRelationship)
.groupByKey(_._1)
.reduceGroups((left, right) => combineBidirerRelationships(left,right))
.map(_._2._2)
在使用groupByKey(\u1)
之前,数据集的架构:
数据集中的一些实际数据:
不确定它是否更有效,但是,应该可以转换为
reduceByKey
,因为您直接在groupByKey
之后执行reducegroup
。使用提供的部分代码的简短示例:
val biLinks = links
.map(convertToRelationship)
.flatMap(bidirRelationship)
.rdd
.map{row => (row.getAs[String](0), row.getAs[Relationship](1))} // See explanation below
.reduceByKey((left, right) => combineBidirerRelationships(left, right))
.map(_._2._2)
根据使用.rdd
后数据帧的外观,可能需要进行额外的转换。从数据帧转换时,生成的rdd将是一个rdd[Row]
。但是,对于reduceByKey()
来说,需要类型为rdd[(a,B)]
的元组rdd,其中a
和B
是类型(它们也可以是元组本身)
rdd.map(…)
转换如何使用结构的简短示例:
case class Relationship(a: Long, b: Long)
val df = spark.createDataFrame(Seq((1, Relationship(3L, 2L)), (2, Relationship(20L, 7L)))).toDF()
val rdd = df.rdd.map{ row => (row.getAs[String](0), row.getAs[Relationship](1))}
这给出了所需的元组rdd类型,这里rdd[(字符串,关系)]
不确定它是否更有效,但是,应该可以转换为reduceByKey
,因为您直接在groupByKey
之后执行reducegroup
。使用提供的部分代码的简短示例:
val biLinks = links
.map(convertToRelationship)
.flatMap(bidirRelationship)
.rdd
.map{row => (row.getAs[String](0), row.getAs[Relationship](1))} // See explanation below
.reduceByKey((left, right) => combineBidirerRelationships(left, right))
.map(_._2._2)
根据使用.rdd
后数据帧的外观,可能需要进行额外的转换。从数据帧转换时,生成的rdd将是一个rdd[Row]
。但是,对于reduceByKey()
来说,需要类型为rdd[(a,B)]
的元组rdd,其中a
和B
是类型(它们也可以是元组本身)
rdd.map(…)
转换如何使用结构的简短示例:
case class Relationship(a: Long, b: Long)
val df = spark.createDataFrame(Seq((1, Relationship(3L, 2L)), (2, Relationship(20L, 7L)))).toDF()
val rdd = df.rdd.map{ row => (row.getAs[String](0), row.getAs[Relationship](1))}
这给出了所需的元组rdd类型,这里是rdd[(字符串,关系)]
我了解到reducebyKey是大型数据集上的一个更好的选择,可以减少reduce端的无序和/或无序,并提高性能
事实并非如此。您混淆了“旧”RDDAPI,其中groupByKey
具有不同的语义
在Dataset
APIgroupByKey
+reducegroup
中,使用与旧API中的reduceByKey
类似的执行模型。事实上,到RDD的转换使用了效率较低的洗牌机制,而且成本非常高,所以您只会让它变得更糟
我了解到reducebyKey是大型数据集上的一个更好的选择,可以减少reduce端的无序和/或无序,并提高性能
事实并非如此。您混淆了“旧”RDDAPI,其中groupByKey
具有不同的语义
在Dataset
APIgroupByKey
+reducegroup
中,使用与旧API中的reduceByKey
类似的执行模型。事实上,到RDD的转换使用了效率较低的洗牌机制,而且成本非常高,所以你只是让它变得更糟。在groupByKey()
之前,您的数据是什么样子的?@Shaido like soDataSet(String,Relationship)
然后应该像groupByKey之后一样,KeyValueGroupedDataSet[String,(字符串、关系)]
添加了一个我相信会奏效的答案,尽管我没有测试它,但请告诉我它是如何工作的。@Shaido添加了一张图片,这两张图片添加了,col1:String,col2:Relationshi
当我打印我们试图转换的内容的模式时,它们是struct1
和struct2
,例如struct2是关系的数据p case class created还可以添加show()
的输出吗?在groupByKey()
之前,您的数据是什么样子的?@Shaido类似于soDataSet(String,Relationship)
然后应该与groupByKey的后面一样,KeyValueGroupedDataSet[String,(String,Relationship)]
添加了一个我相信会奏效的答案,尽管我没有测试它,但请告诉我它是如何工作的。@Shaido添加了一张图片,这两张图片添加了,col1:String,col2:Relationshi
当我打印我们试图转换的内容的模式时,它们是struct1
和struct2
,例如struct2是关系的数据p case class created是否可以添加show()的输出
还有?这两个添加了,col1:String,col2:Relationship
当我打印我们尝试转换的模式时,它们是struct1和struct2,例如struct2是创建的关系案例类的数据?这两个添加了,col1:String,col2:Relationship
,当我打印我们尝试转换的模式时转换,它们是struct1和struct2,例如struct2是创建的关系案例类的数据?