我正在使用 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(...)
的位置?在最后一个片段中?
最佳答案
您可以在具有 map 的 Row 上使用 toSeq()。 toSeq 将与行的顺序相同
关于scala - 迭代 org.apache.spark.sql.Row,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30353705/