2016-01-20 3 views
0

Я бы хотел использовать API Scark scala для этого. У меня есть данные в следующем формате:Spark RDD: сортировка массива чисел

id1 val1, val2, val3 
id2 val1, val2, val3, val4, val5, val6 
id3 val1, val2, val3, val4 

все vals являются целыми числами, и я хотел бы, чтобы результат был отсортирован. Например, для следующего в/р

1 100, 20, 150 
10 50, 1000, 2, 400 

результат должен быть:

1 20, 100, 150 
10 2, 50, 400, 1000 

Любая помощь будет здорово!

Вот код для чтения файла:

val dummy_data = sc.textFile("pato/to/file").map(line => ((line.split("\t"))(0), (line.split("\t"))(1).split(","))) 
dummy_data.collect() 

Приведенный выше код дает о/р, как: Array [(String, Array [String])] = Array ((100, Array (5 , 2, 4, 3, 1)), (1000, Array (14, 11, 10, 12, 13)))

Теперь, как мне сделать эту dummy_data соответствующим образом, чтобы я мог сортировать значения во втором элемент.

ответ

0

mapValues с sorted должен сделать трюк:

  • Scala:

    sc.parallelize(Seq(
        (1, Seq("100", "20", "150")), (10, Seq("50", "1000", "2", "400")))) 
        .mapValues(_.map(_.toInt).sorted) 
        .take(2) 
    // Array[(Int, Seq[Int])] = 
    // Array((1,List(20, 100, 150)), (10,List(2, 50, 400, 1000))) 
    
  • Python:

    (sc.parallelize([(1, ("100", "20", "150")), (10, ("50", "1000", "2", "400"))]) 
        .mapValues(lambda xs: sorted(int(x) for x in xs)) 
        .take(2)) 
    ## [(1, [20, 100, 150]), (10, [2, 50, 400, 1000])] 
    
+0

Когда я прочитал его из файла с помощью СБН. textFile, it com es out как org.apache.spark.rdd.RDD [(String, Seq [String])], а не как org.apache.spark.rdd.RDD [(String, Seq [Int])], что было бы самым эффективный способ его корректного использования - Seq (Int)? – user3803714

+0

Просто замените '_.sorted' на' _.map (_. ToInt) .sorted' – zero323

+0

Обновлен вопрос. – user3803714