2016-09-05 7 views
0

После вопроса, который я разместил здесь:Спарк Scala - Сплит столбцы в несколько строк

Spark Mllib - Scala

Я еще одно сомнение ... Есть возможность превратить набор данных, как это:

2,1,3 
1 
3,6,8 

в это:

2,1 
2,3 
1,3 
1 
3,6 
3,8 
6,8 

в основном я хочу, чтобы открыть все отн отношения между фильмами. Можно это сделать?

Мой текущий код:

val input = sc.textFile("PATH") 
val raw = input.lines.map(_.split(",")).toArray 
val twoElementArrays = raw.flatMap(_.combinations(2)) 
val result = twoElementArrays ++ raw.filter(_.length == 1) 

ответ

2

Учитывая, что input является строка из нескольких строк.

scala> val raw = input.lines.map(_.split(",")).toArray 
raw: Array[Array[String]] = Array(Array(2, 1, 3), Array(1), Array(3, 6, 8)) 

После подхода отбрасывает одноэлементные массивы, 1 в вашем примере.

scala> val twoElementArrays = raw.flatMap(_.combinations(2)) 
twoElementArrays: Array[Array[String]] = Array(Array(2, 1), Array(2, 3), Array(1, 3), Array(3, 6), Array(3, 8), Array(6, 8)) 

Это может быть исправлено путем добавления отфильтрованной коллекции raw.

scala> val result = twoElementArrays ++ raw.filter(_.length == 1) 
result: Array[Array[String]] = Array(Array(2, 1), Array(2, 3), Array(1, 3), Array(3, 6), Array(3, 8), Array(6, 8), Array(1)) 

Порядок комбинаций не имеет значения. Я считаю.


Update SparkContext.textFile возвращает RDD строк, поэтому он может быть подключен как:

val raw = rdd.map(_.split(",")) 
+0

Привет Томаш Blachut, большое спасибо !!! Я получаю ошибку, когда я подаю необработанную переменную ... Я обновляю код, который я использую. Ошибка: error: строки значений не является членом org.apache.spark.rdd.RDD [String] – SaCvP

+0

@PedroRodgers Ну да, я написал, что ввод представляет собой многострочную строку, а не RDD линий. Я обновляю ответ с помощью решения, закодированного вручную, но у меня нет Spark на этой машине, чтобы проверить его. –

+1

Не волнуйтесь, я просто удаляю .lines, и это работает;) – SaCvP

Смежные вопросы