【问题标题】:Creating RDDs and outputting to text files with Scala and Spark使用 Scala 和 Spark 创建 RDD 并输出到文本文件
【发布时间】:2015-03-26 22:27:54
【问题描述】:

对于可能是一个简单的问题,我深表歉意,但我正在努力掌握如何使用 scala/spark 解析 rdd。我有一个从 CSV 创建的 RDD,用

读入
    val partitions: RDD[(String, String, String, String, String)] = withoutHeader.mapPartitions(lines => {
            val parser = new CSVParser(',')
            lines.map(line => {
                    val columns = parser.parseLine(line)
                    (columns(0), columns(1), columns(2), columns(3), columns(4))
            })
    })

当我用

将其输出到文件时
partitions.saveAsTextFile(file)

我得到每行带括号的输出。我不想要这些括号。我一般都在努力理解这里发生的事情。我的背景是低级语言,我正在努力通过抽象来了解它实际在做什么。我理解映射,但它是逃避我的输出。有人可以向我解释(columns(0), columns(1), columns(2), columns(3), columns(4)) 行中发生了什么,或者指向一个简单解释正在发生的事情的指南吗?

我的最终目标是能够在 spark 中操作 hdsf 上的文件,以将它们放入适合 mllib 的格式。我对 spark 或 scala 指南不感兴趣,因为它们看起来像是用注释不佳的 javadocs 生成的并没有真正解释任何事情。

提前致谢。

院长

【问题讨论】:

  • 能否展示您的输出文件样本?
  • 输出文件如下图: (3.5,1.4,0.2,setosa) (3,1.4,0.2,setosa) (3.2,1.3,0.2,setosa) (3.1,1.5,0.2,setosa) ( 3.6,1.4,0.2,setosa)

标签: scala apache-spark


【解决方案1】:

我只会将您的元组转换为您想要的字符串格式。例如,要创建 |-delimited 输出:

partitions.map{ tup => s"${tup._1}|${tup._2}|${tup._3}|${tup._4}|${tup._5}" }

或使用模式匹配(会产生更多的运行时开销):

partitions.map{ case (a,b,c,d,e) => s"$a|$b|$c|$d|$e" }

我正在使用 Scala 的字符串插值功能(注意 s"..." 格式)。

旁注,您可以通过将 RDD 作为一个整体而不是单个分区进行映射来简化您的示例:

val parser = new CSVParser(',')
val partitions: RDD[(String, String, String, String, String)] = 
  withoutHeader.map { line => 
    val columns = parser.parseLine(line)
    (columns(0), columns(1), columns(2), columns(3), columns(4))
  }

【讨论】:

  • 如果我在整个 RDD 上进行映射,如果我通过纱线作业在分布式系统上处理一个巨大的文件,这是否会影响性能?在单个分区上工作感觉应该使用 yarn 更有效,尽管这只是基于我认为并行化可能的工作方式。
  • +1 我太复杂了,没有先考虑简单:)。至于上面的问题。这取决于 CSVParser 到底有多贵。使用 mapPartitions 的最大原因是减少实例化。如果它是一个简单的解析器,那么创建一次并通过网络发送它应该没问题。您所做的只是在似乎没有必要的地方进行微观管理。
  • 同意。 RDD.map 实际上使用了mapPartition 变体之一,因此除非您需要更细粒度的控件,否则显式调用它并没有太大的好处。
  • 完美。感谢您的意见。贾斯汀,您的解决方案可能更复杂,但我很欣赏对后台发生的事情的解释。真的很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2015-07-05
  • 2019-02-17
  • 2020-07-25
  • 2020-08-11
  • 2020-07-22
相关资源
最近更新 更多