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 将groupByKey转换为reduceByKey_Scala_Apache Spark_Spark Dataframe_Rdd - Fatal编程技术网

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
API
groupByKey
+
reducegroup
中,使用与旧API中的
reduceByKey
类似的执行模型。事实上,到RDD的转换使用了效率较低的洗牌机制,而且成本非常高,所以您只会让它变得更糟

我了解到reducebyKey是大型数据集上的一个更好的选择,可以减少reduce端的无序和/或无序,并提高性能

事实并非如此。您混淆了“旧”RDDAPI,其中
groupByKey
具有不同的语义


Dataset
API
groupByKey
+
reducegroup
中,使用与旧API中的
reduceByKey
类似的执行模型。事实上,到RDD的转换使用了效率较低的洗牌机制,而且成本非常高,所以你只是让它变得更糟。

groupByKey()
之前,您的数据是什么样子的?@Shaido like so
DataSet(String,Relationship)
然后应该像groupByKey之后一样,
KeyValueGroupedDataSet[String,(字符串、关系)]
添加了一个我相信会奏效的答案,尽管我没有测试它,但请告诉我它是如何工作的。@Shaido添加了一张图片,这两张图片添加了,
col1:String,col2:Relationshi
当我打印我们试图转换的内容的模式时,它们是
struct1
struct2
,例如struct2是关系的数据p case class created还可以添加
show()
的输出吗?在
groupByKey()
之前,您的数据是什么样子的?@Shaido类似于so
DataSet(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是创建的关系案例类的数据?