如何在Spark中展平元组?

gle*_*ech 4 scala apache-spark rdd

我想要扁平化一个元组的RDD(使用无操作映射),但我得到一个类型错误:

val fromTuples = sc.parallelize( List((1,"a"), (2, "b"), (3, "c")) )
val flattened = fromTuples.flatMap(x => x)
println(flattened.collect().toNiceString)
Run Code Online (Sandbox Code Playgroud)

错误:类型不匹配;

发现:(Int,String)必需:TraversableOnce [?]

val flattened = fromMap.flatMap(x => x)

Lists或Arrays 的等效列表工作正常,例如:

val fromList = sc.parallelize(List(List(1, 2), List(3, 4)))
val flattened = fromList.flatMap(x => x)
println(flattened.collect().toNiceString)
Run Code Online (Sandbox Code Playgroud)

Scala可以处理这个吗?如果没有,为什么不呢?

Bri*_*per 9

元组不是集合.与Python不同,其中元组本质上只是一个不可变列表,Scala中的元组更像是一个类(或者更像是Python namedtuple).你不能"扁平化"元组,因为它是一组不同的领域.

可以通过调用.productIterator将一个元组转换为可迭代的东西,但是你得到的是一个Iterable[Any].你当然可以压扁这样的东西,但你已经失去了所有编译时类型的保护.(大多数Scala程序员都想到了一个类型的集合Any.)


gle*_*ech 1

从 Lyuben 的评论来看,这实际上可以偷偷地完成:

sc.parallelize(List(("a", 1), ("c", 2), ("e", 4))).flatMap(_.productIterator).collect()
Run Code Online (Sandbox Code Playgroud)

一切荣誉归于他。(尽管正如Brian 指出的,这将放弃类型安全。)