Spark,Scala - 从rdd map

时间:2016-12-29 04:35:50

标签: scala apache-spark

我想用spark制作数据报告。 我想做的概念如下。

case class output( txt: String)
outputList: List[output] = ..
myrdd
    .filter( ..)
    .map( 
        some processing
        outputList ::= output( ..) 
    )

// this is why I cannot just union rdd with rdd
anotherRdd.map(
    ...some processing...
    val rdd = ..make rdd from rdd..
    rddinrdd.map( 
         ...some processing...
         outputList ::= output( ..)
    )
)

// save it as text
..save outputList somehow..

我知道它不起作用,因为在存储所有输出之前会保存outputList,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

你正在尝试做两件Spark不支持的事情:

  1. 在RDD转换中突变驱动程序端对象(outputList
  2. 在RDD转换中使用RDD(rddinrdd不受支持 - 驱动程序端存在RDD,并且在执行程序上完成转换)
  3. 很难在没有更具体要求的情况下提出替代方案,但通常情况下,你应该将RDD转换为RDD [输出] :这就是Spark的使用方式 - 不要试图构建outputList,尝试通过转换构建outputRDD

    • 对于第一个rdd,看起来很简单 - 而不是将output(..)添加到列表中,只需将该函数设置为返回值 - 然后map操作的结果将为{ {1}}

      RDD[output]
    • 对于第二个rdd,您可能必须加入某个键上的两个RDD,假设“..make rdd from rdd ..”使用{{中的当前记录1}},所以通常它看起来像:

      val outRdd1: RDD[output] = myrdd
       .filter( ..)
       .map( 
         some processing
         output( ..) 
       )
      
    • 最后,您可以合并生成的RDD并使用anotherRdd

    • 保存结果