我想在scala中使用Transpose of a Dataset?
我的csv文件是,
a,b,c,d
e,f,g,h
i,j,k,l
m,n,o,p
我需要结果为,
a,e,i,m
b,f,j,n
c,g,k,o
d,h,l,p
答案 0 :(得分:3)
我认为可以在Spark中使用的一个班轮。
val a = List(
List('a', 'b', 'c', 'd'),
List('e', 'f', 'g', 'h'),
List('i', 'j', 'k', 'l'),
List('m', 'n', 'o', 'p')
)
val b = sc.parallize(a,1)
b.flatMap(_.zipWithIndex)
.groupBy(_._2)
.mapValues(_.map(_._1))
.collectAsMap()
.toList
.sortBy(_._1)
.map(_._2)
//> List[Iterable[Char]] = List(
// List(a, e, i, m), List(b, f, j, n), List(c, g, k, o), List(d, h, l, p))
使用索引对每个列表的每个元素进行压缩,然后按该索引进行分组。所以我们有地图0 -> <list of (elements, index) at that index>
。将值转换为值列表。然后将结果转换为列表(通过包含collectAsMap
的地图,因为RDD
没有.toList
),因此我们可以按索引对其进行排序。然后按索引对其进行排序,并提取(使用另一个地图)元素值。
答案 1 :(得分:1)
使用transpose
方法:
val a = List(
List('a', 'b', 'c', 'd'),
List('e', 'f', 'g', 'h'),
List('i', 'j', 'k', 'l'),
List('m', 'n', 'o', 'p')
)
a.transpose
//List(
// List(a, e, i, m),
// List(b, f, j, n),
// List(c, g, k, o),
// List(d, h, l, p))