2014-12-08 69 views
3

我想要在斯卡拉转移数据集?如何在scala中转置数据集?

我的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

a中的每个元素都将是RDD的大小(我认为它很大)。你确定你想要列表清单,还是RDD列表?) – 2014-12-08 07:44:00

+0

我们确实需要知道你想要什么作为输出。 “明显的”解决方案给出了RDD [列表[Char]],但该列表将会很大 - RDD的每一行都有一个条目。所以我怀疑你不想使用'转置',或者你想要'列表[RDD [Char]]' – 2014-12-08 11:41:27

回答

3

一个衬垫,我认为在星火工程。

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

使用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)) 
+0

我的输入不是列表[],它是RDD [] – rosy 2014-12-08 05:56:28