2015-12-17 3 views
1

Мои исходные данные из файла CSV является:Спарк РДД карта внутренний объект Row

1 ,21658392713 ,21626890421 
1 ,21623461747 ,21626890421 
1 ,21623461747 ,21626890421 

Данные у меня после нескольких преобразований и группировки на основе бизнес-логики дает

scala> val sGrouped = grouped 
sGrouped: org.apache.spark.rdd.RDD[(String, Iterable[(String,  
(Array[String], String))])] = ShuffledRDD[85] at groupBy at <console>:51 

scala> sGrouped.foreach(f=>println(f)) 
(21626890421,CompactBuffer((21626890421, 
      ([Ljava.lang.String;@62ac8444,21626890421)), 
      (21626890421,([Ljava.lang.String;@59d80fe,21626890421)),  
      (21626890421,([Ljava.lang.String;@270042e8,21626890421)), 

из это я хочу получить карту, которая дает что-то вроде следующего формата:

[String, Row[String]] 

, так что данные могут выглядеть так:

[ 21626890421 , Row[(1 ,21658392713 ,21626890421) 
       , (1 ,21623461747 ,21626890421) 
       , (1 ,21623461747,21626890421)]] 

Я очень ценю любые рекомендации по продвижению по этому вопросу.

+1

Вы хотите, чтобы строка или просто массив был достаточным? – Kakarot

+2

Нет такой вещи, как 'Row [String]'. И что именно 'Array' от' (Array [String], String) 'сопоставляется с вашим желаемым выходом? – zero323

ответ

0

Я нашел ответ, но я не уверен, что это эффективный способ, все более понятные подходы оценены, так как это больше похоже на хак.

scala> import org.apache.spark.sql.Row 
scala> val grouped = cToP.groupBy(_._1) 
grouped: org.apache.spark.rdd.RDD[(String, Iterable[(String, 
(Array[String], String))])] 

scala> val sGrouped = grouped.map(f => f._2.toList) 
sGrouped: org.apache.spark.rdd.RDD[List[(String, (Array[String],  
String))]] 


scala> val tGrouped = sGrouped.map(f =>f.map(_._2).map(c => 
Row(c._1(0), c._1(12), c._1(18)))) 
tGrouped: org.apache.spark.rdd.RDD[List[org.apache.spark.sql.Row]] = 
MapPartitionsRDD[42] a 

scala> tGrouped.foreach(f => println(f)) 

дает

List([1,21658392713,21626890421], [1,21623461747,21626890421],  
[1,21623461747,21626890421]) 
scala> tGrouped.count() 
res6: Long = 1 

Ответ Я получаю правильно, и даже граф является правильным. Тем не менее, я не понимаю, почему счет равен 1.

+1

Вы получаете пары ключ/значение, в вашем случае только одна пара, указанная на вашем выходе. Значение в вашей паре «ключ/значение» - это список, но это не тот список, который вы подсчитываете. – YoYo