当前位置: 首页 > 知识库问答 >
问题:

使用reduceByKey时scala中的类型不匹配

解浩渺
2023-03-14

我已经在scala shell中单独测试了我的错误代码

scala> val p6 = sc.parallelize(List( ("a","b"),("b","c")))
p6: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[10] at parallelize at <console>:24

scala> val p7 = p6.map(a => ((a._1+a._2), (a._1, a._2, 1)))
p7: org.apache.spark.rdd.RDD[(String, (String, String, Int))] = MapPartitionsRDD[11] at map at <console>:26

scala> val p8 = p7.reduceByKey( (a,b) => (a._1,(a._2, a._3+b._3)))
<console>:28: error: type mismatch;
 found   : (String, (String, Int))
 required: (String, String, Int)
       val p8 = p7.reduceByKey( (a,b) => (a._1,(a._2, a._3+b._3)))

我想使用a.\u 1作为键,这样我可以进一步使用join操作符,并且需要(键,值)对。但我的问题是,为什么在使用reduce函数时会有一个required类型?我认为这种形式是由我们自己设定的,而不是有规定的。我错了吗?

此外,如果我错了,那么为什么需要它(String,String,Int)?为什么不是别的?

ps:我知道(String,String,Int)(a.\u 1 a.\u 2),(a.\u 1,a.\u 2,1))中的值类型,这是映射函数,但官方示例显示reduce函数(a,b)=


共有2个答案

弘浩博
2023-03-14

您的p7属于组织。阿帕奇。火花rdd。RDD[(String,(String,String,Int)]但是在你的reduceByKey中你使用了(a._1,(a._2,a._3b._3))类型(String,(String,Int))

p8的输出类型也应该是:org。阿帕奇。火花rdd。RDD[(String,(String,String,Int))]

所以像下面这样定义应该对你有用

val p8 = p7.reduceByKey( (a,b) => (a._1, a._2, a._3+b._3))

您可以阅读我在pyspark中的回答,了解有关reduceByKey如何工作的更多详细信息

这个也应该有用

云啸
2023-03-14
匿名用户

看看这些类型。按键减少是RDD[(K,V)]上的方法,带有签名:

def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]

换句话说,输入参数和返回参数必须是相同的类型。

在您的情况下,p7是

RDD[(String, (String, String, Int))]

其中,K是字符串,V是(字符串,字符串,Int),因此与reduceByKey一起使用的函数必须是

((String, String, Int), (String, String, Int)) => (String, String, Int)

有效函数应为:

p7.reduceByKey( (a,b) => (a._1, a._2, a._3 + b._3))

这会给你

(bc,(b,c,1))
(ab,(a,b,1))

因此

如果要更改byKey方法中的类型,必须使用aggregateByKey或combineByKey。

 类似资料:
  • 如何实现reduceByKey而不是上面的代码来提供相同的映射?

  • 我对Scala很陌生,请耐心等待。我有一堆包裹在一个大数组中的期货。期货已经完成了他们的辛勤工作,查看了一些TB的数据,在我的应用程序结束时,我想总结所有的结果,这样我就可以很好地展示它们。 我拥有的期货集合属于以下类型: 到目前为止,我读到的所有关于理解的东西都表明 导致 按照同样的逻辑,我的意图是这样做,因为我最近发现选项,尝试,失败和成功可以被视为集合: 但这不一定行得通。我似乎收到了以下编

  • 我遇到了一个关于Scala和多种未来收益的问题。f1和f2都是期货。f2期货基于从f1期货获得的值。 根据 f1 的结果,我要么在 if 语句计算结果为 false 时执行 Lookup(),要么返回 LookupResult),要么模仿默认的 LookupResult。 返回以下错误: 类型不匹配。必需:选项[B_],找到:Future[(MyNode,Any)] 我只是没有正确映射结果吗?例如

  • 有四种不同的类型:地点、语言、技术和行业。每个类型都有一个存储库,可以返回这些类型的集合。例如位置列表。每个类型都有一个类型为String的name属性。有一个字符串列表。它可以包含位置、语言等名称。我想编写一个函数来查找那些与字符串列表名称匹配的类型实体(位置、语言、...)。我在想这样的事情: 这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?

  • 我有一个从提取的代码,对于多个子类来说,这个代码看起来应该完全相同,所以我尽量避免重复。但是,实际上(见下文),scala认为是一个泛型的,返回的值类型为,当然,它没有和方法。 问题是在这里避免重复的适当方法是什么?我对将转换为字符串并不那么着迷,因为这段代码可以使用刚从字符串解析为AST的json。我开始考虑为我需要的三种类型编写包装器,并将这些类型的匹配和隐式转换器转换为包装器,然后为这些包装

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的