我使用的是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
而且 - 据我所知 - 它无法转换为Array
或List
,所以我无法逃脱细胞使用这种风格。我可以使用索引变量编写一个循环,但这会很不方便。我想在这样的情况下迭代单元格:
result.collect().map(row => row.map(cell => StringEscapeUtils.escapeCsv(cell)).mkString(",")).mkString("\n")
(这些通常不是很大的结果,它们可以多次适合客户端内存。)
有没有办法迭代Row
的单元格?是否有任何语法将基于索引的循环放在最后一个片段中row.map(...)
的位置?
答案 0 :(得分:0)
你可以在Row上使用带有map的toSeq()。 toSeq将与行
的顺序相同