2016-01-18 2 views
0

Я пытаюсь разобрать и объединить два столбца в то же время, используя следующее выражение:Разобрать и конкатенации двух столбцов

val part : RDD[(String)] = sc.textFile("hdfs://xxx:8020/user/sample_head.csv") 
        .map{line => val row = line split ',' 
        (row(1), row(2)).toString} 

который возвращает что-то вроде:

Array((AAA,111), (BBB,222),(CCC,333)) 

Но как я мог напрямую get:

Array(AAA, 111 , BBB, 222, CCC, 333) 
+1

Вы явно превращаете его в форму '' (AAA, 111) '' с '.toString', поэтому неясно, чего вы на самом деле хотите. Но возможно '.flatMap {cols => cols split ','; Array (cols (1), cols (2))}' будет делать это. –

ответ

1

Ваш toString() на кортежей действительно не имеет для меня никакого смысла. Можете ли вы объяснить, почему вы хотите создать строки из кортежей, а затем разделить их позже?

Если вы готовы отобразить каждую строку в список элементов, а не в строковой кортеж элементов, можно переписать

(row(1), row(2)).toString 

к

List(row(1), row(2)) 

и просто придавить результирующий список:

val list = List("0,aaa,111", "1,bbb,222", "2,ccc,333") 

val tuples = list.map{ line => 
    val row = line split ',' 
    List(row(1), row(2))} 

val flattenedTuples = tuples.flatten 

println(flattenedTuples) // prints List(aaa, 111, bbb, 222, ccc, 333) 

Обратите внимание, что то, что вы пытаетесь достичь, связано с уплощением и может быть d один использует flatMap, но не использует только карту. Вам нужно либо flatMap напрямую, либо карту, а затем сгладить, как я показал вам (я честно не помню, поддерживает ли Spark flatMap). Кроме того, как вы можете видеть, я использовал список как более идиоматическую структуру данных Scala, но он легко конвертируется в Array и наоборот.

+0

"(Я честно не помню, поддерживает ли Spark flatMap)". Оно делает. –