【问题标题】:Iterating on org.apache.spark.sql.Row迭代 org.apache.spark.sql.Row
【发布时间】:2017-01-12 06:44:56
【问题描述】:

我正在使用 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 的单元格?是否有任何语法可以将基于索引的循环放在最后一个 sn-p 中 row.map(...) 的位置?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    您可以在具有地图的 Row 上使用 toSeq()。 toSeq 将与行的顺序相同

    【讨论】:

    • 我总是怀疑 collect 然后再迭代它,所以如果你不介意你能解释为什么你不能分发你的操作(即需要把所有东西都放在一个 m/c 中)吗?要回答您的问题,您可以映射 RDD 并将其从 Row 转换回元组,然后收集。
    • Unspecified value parameter idx
    • @ayanguha 没关系。问题是一样的,我们要迭代每一行。远程或本地:没关系。结果集 - 正如我所说 - 很小。
    猜你喜欢
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 2016-01-07
    • 2016-09-17
    • 1970-01-01
    • 2015-10-29
    相关资源
    最近更新 更多