【问题标题】:Mapping in Spark ScalaSpark Scala 中的映射
【发布时间】:2014-11-12 00:41:54
【问题描述】:

我是 Spark 和 Scala 以及一般此类编程的新手。

我想要完成的是:

我有一个 RDD,它是 org.apache.spark.rdd.RDD**[(Double, Iterable[String])]**

所以可能的内容可能是:

<1 , (A,B,C)>
<42, (A)    >
<0 , (C,D)  >

我需要以这种方式将其转换为新的 RDD,以便得到类似的输出:

<1, A>
<1, B>
<1, C>
<42, A>
<0, C>
<0, D>

这一定很简单,但我尝试了很多不同的方法,但都无法做到。

【问题讨论】:

    标签: scala apache-spark mapping


    【解决方案1】:

    你可以使用flatMapValues:

    import org.apache.spark.SparkContext._
    
    val r : RDD[(Double, Iterable[String])] = ...
    r.flatMapValues(x => x)
    

    【讨论】:

    • 我收到一个错误:“缺少扩展函数的参数类型” 但是,只需将 (_) 替换为 (x=>x) 就可以了!所以:val A = B.flatMapValues(x =>x)
    • @zsxwing 这不是类型推断问题 - x =&gt; x 仍然需要类型推断才能工作。只是 _ 在特定上下文中并不意味着身份功能。
    【解决方案2】:

    让我们输入类似

    (Name , List[Interest]),

    "Chandru",("Java","Scala","Python")
    "Sriram", ("Science","Maths","Hadoop","C2","c3")
    "Jai",("Flink","Scala","Haskell")
    

    为这个人创建一个案例类,

     case class Person(name:String, interest:List[String])
    

    创建输入

     val input={Seq(Person("Chandru",List("Java","Scala","Python")),Person("Sriram",List("Science","Maths","Hadoop","C2","c3")),Person("Jai",List("Flink","Scala","Haskell")))}
    
     val rdd=sc.parallelize(input)
    
     val mv=rdd.map(p=>(p.name,p.interest))
    
     val fmv=mv.flatMapValues(v=>v.toStream)
    
     fmv.collect
    

    结果是:

      Array[(String, String)] = Array(
      (Chandru,Java), 
      (Chandru,Scala), 
      (Chandru,Python), 
      (Sriram,Science), 
      (Sriram,Maths), 
      (Sriram,Hadoop), 
      (Sriram,C2), 
      (Sriram,c3), 
      (Jai,Flink), 
      (Jai,Scala), 
      (Jai,Haskell))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 2021-12-31
      • 2016-06-06
      • 2018-04-25
      • 1970-01-01
      相关资源
      最近更新 更多