2015-10-22 6 views
1

Я есть набор данных в формате CSV, что я хочу, чтобы обработать с помощью Спарк, второй столбец этого формата:Invert карта и reduceByKey в Спарк-Scala

гггг-мм-дд чч: мм: сс

Я хочу, чтобы сгруппировать каждый ММ-ДД

val days : RDD = sc.textFile(<csv file>) 

val partitioned = days.map(row => { 

    row.split(",")(1).substring(5,10) 

}).invertTheMap.groupOrReduceByKey 

результат groupOrReduceByKey имеет вид:

("MM-dd" -> (row1, row2, row3, ..., row_n)) 

Как шо uld I реализовать invertTheMap и groupOrReduceByKey?

Я видел это в Python here, но мне интересно, как это делается в Scala?

+0

Посмотрите на org.apache.spark.sql.SQLContext, чтобы сделать работу с томами CSV проще – Simon

ответ

1

Это должно сделать трюк

val testData = List("a, 1987-09-30", 
    "a, 2001-09-29", 
    "b, 2002-09-30") 

val input = sc.parallelize(testData) 

val grouped = input.map{ 
    row => 
    val columns = row.split(",") 

    (columns(1).substring(6, 11), row) 
}.groupByKey() 

grouped.foreach(println) 

Выход

(09-29,CompactBuffer(a, 2001-09-29)) 
(09-30,CompactBuffer(a, 1987-09-30, b, 2002-09-30)) 
+0

вы можете поделиться, как обратитесь к CompactBuffer с помощью ключа в общем виде и преобразуйте CompactBuffer в RDD? Благодарю. – menorah84

+1

'groupByKey' вернет' RDD [(Key, Iterable [Value])] 'где' Key' '' String', а 'Value' -' String', а также в моем примере. Оттуда вы можете просто продолжить свои вычисления. –