Я использую 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(...)
в последнем фрагменте?
Я всегда сомневаюсь в сборе, а затем снова итерации на нем, поэтому, если вы не возражаете, можете ли вы объяснить, почему вы не можете распространять свою операцию (т. е. нужно привести все в один м/с)? Чтобы ответить на ваш вопрос, вы можете сопоставить RDD и преобразовать его из строки в кортеж, а затем собрать. –
'Неопределенный параметр значения idx' – Notinlist
@ayanguha Это не имеет значения. Проблема такая же, мы хотим итерации по каждой строке. Удаленно или локально: это не имеет значения. Результирующий набор, как я уже сказал, мал. – Notinlist