2015-05-20 1 views
4

Я использую Spark shell (1.3.1), который является оболочкой Scala. Упрощенная ситуация, которая нуждается в итерацию на что-то вроде этого:Итерация на org.apache.spark.sql.Row

import org.apache.commons.lang.StringEscapeUtils 

var result = sqlContext.sql("....") 
var rows = result.collect() // Array[org.apache.spark.sql.Row] 
var row = rows(0) // org.apache.spark.sql.Row 
var line = row.map(cell => StringEscapeUtils.escapeCsv(cell)).mkString(",") 
// error: value map is not a member of org.apache.spark.sql.Row 
println(line) 

Моя проблема заключается в том, что не map и - насколько я знаю, - это не может быть преобразован в Array или List, поэтому я не могу избежать каждая ячейка использует этот стиль. Я мог бы написать цикл, используя индексную переменную, но это было бы неудобно. Я хотел бы перебирать на клетки в такой ситуации:

result.collect().map(row => row.map(cell => StringEscapeUtils.escapeCsv(cell)).mkString(",")).mkString("\n") 

(Это, как правило, не большие результаты, они могут поместиться в память клиента много раз.)

Есть ли способ для перебора на ячейках ? Есть ли какой-либо синтаксис для размещения цикла на основе индекса в месте row.map(...) в последнем фрагменте?

ответ

0

Вы можете использовать toSeq() на Row, который имеет карту. toSeq будет в том же порядке, что и строки

+2

Я всегда сомневаюсь в сборе, а затем снова итерации на нем, поэтому, если вы не возражаете, можете ли вы объяснить, почему вы не можете распространять свою операцию (т. е. нужно привести все в один м/с)? Чтобы ответить на ваш вопрос, вы можете сопоставить RDD и преобразовать его из строки в кортеж, а затем собрать. –

+0

'Неопределенный параметр значения idx' – Notinlist

+0

@ayanguha Это не имеет значения. Проблема такая же, мы хотим итерации по каждой строке. Удаленно или локально: это не имеет значения. Результирующий набор, как я уже сказал, мал. – Notinlist

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