gpt4 book ai didi

scala - 使用 apache Spark 联合元组列表

转载 作者:行者123 更新时间:2023-12-03 01:56:02 24 4
gpt4 key购买 nike

我正在尝试联合 RDD:

val u1 = sc.parallelize(List ( ("a" , (1,2)) , ("b" , (1,2))))
val u2 = sc.parallelize(List ( ("a" , ("3")) , ("b" , (2))))

我收到错误:

 scala> u1 union u2
<console>:17: error: type mismatch;
found : org.apache.spark.rdd.RDD[(String, Any)]
required: org.apache.spark.rdd.RDD[(String, (Int, Int))]
Note: (String, Any) >: (String, (Int, Int)), but class RDD is invariant in type
T.
You may wish to define T as -T instead. (SLS 4.5)
u1 union u2
^

上述每个元组中的 String 类型都是一个键。

是否可以合并这两种类型?

一旦 u1 和 u2 联合,我打算使用 groupBy 根据每个项目的键对其进行分组。

最佳答案

您面临的问题实际上是由编译器解释的:您正在尝试将 (Int,Int) 类型的值与 Any 类型的值连接起来。在以下语句中,AnyStringInt 的父类(super class):sc.parallelize(List ( ("a", ( “3”)),(“b”,(2))))。这可能是一个错误,也可能是有意为之。

无论如何,我会尝试在并集之前使值收敛到公共(public)类型。鉴于Tuple1、Tuple2是不同的类型,我会考虑其他更容易转换的容器。

假设上面的“3”实际上是一个3(Int):

val au1 = sc.parallelize(List ( ("a" , Array(1,2)) , ("b" , Array(1,2))))
val au2 = sc.parallelize(List ( ("a" , Array(3)) , ("b" , Array(2))))
au1 union au2
org.apache.spark.rdd.RDD[(String, Array[Int])] = UnionRDD[10] at union at <console>:17
res: Array[(String, Array[Int])] = Array((a,Array(1, 2)), (b,Array(1, 2)), (a,Array(3)), (b,Array(2)))

Once u1 and u2 are unioned I intent to use groupBy to group each item according to its key.

如果您打算按键对两个 rdd 进行分组,您可以考虑使用 join 而不是 union。这样就可以立即完成工作

au1 join au2
res: Array[(String, (Array[Int], Array[Int]))] = Array((a,(Array(1, 2),Array(3))), (b,(Array(1, 2),Array(2))))

如果上面的 "3" 实际上是 "3" (String):我会考虑首先将值映射到一种常见类型。要么全是字符串,要么全是整数。与使用 Any 作为类型相比,它将使数据更易于操作。你的生活会更轻松。

关于scala - 使用 apache Spark 联合元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24363035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com