迭代org.apache.spark.sql.Row

时间:2015-05-20 15:11:54

标签: scala apache-spark

我使用的是Spark shell(1.3.1),这是一个Scala shell。需要在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)

我的问题是Row没有map而且 - 据我所知 - 它无法转换为ArrayList,所以我无法逃脱细胞使用这种风格。我可以使用索引变量编写一个循环,但这会很不方便。我想在这样的情况下迭代单元格:

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

(这些通常不是很大的结果,它们可以多次适合客户端内存。)

有没有办法迭代Row的单元格?是否有任何语法将基于索引的循环放在最后一个片段中row.map(...)的位置?

1 个答案:

答案 0 :(得分:0)

你可以在Row上使用带有map的toSeq()。 toSeq将与行

的顺序相同