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可以处理这个吗?如果没有,为什么不呢?
元组不是集合.与Python不同,其中元组本质上只是一个不可变列表,Scala中的元组更像是一个类(或者更像是Python namedtuple).你不能"扁平化"元组,因为它是一组不同的领域.
你可以通过调用.productIterator它来将一个元组转换为可迭代的东西,但是你得到的是一个Iterable[Any].你当然可以压扁这样的东西,但你已经失去了所有编译时类型的保护.(大多数Scala程序员都想到了一个类型的集合Any.)
从 Lyuben 的评论来看,这实际上可以偷偷地完成:
sc.parallelize(List(("a", 1), ("c", 2), ("e", 4))).flatMap(_.productIterator).collect()
Run Code Online (Sandbox Code Playgroud)
一切荣誉归于他。(尽管正如Brian 指出的,这将放弃类型安全。)
| 归档时间: |
|
| 查看次数: |
4274 次 |
| 最近记录: |