开发者社区> 问答> 正文

使用Scala从Array(使用Scary改变大小的Array [String)创建元组

使用Scala从Array(使用Scary改变大小的Array [String)创建元组

展开
收起
社区小助手 2018-12-12 11:30:29 2094 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    你的问题的核心与分离内部数组的头部(第一个元素)和尾部(剩余元素)有关,你可以使用head和tail方法。RDD的行为与Scala列表非常相似,因此您可以使用纯Scala代码完成所有操作。

    给出以下输入RDD:

    val input: RDD[Array[Array[String]]] = sc.parallelize(
    Seq(

    Array(
      Array("122abc","223cde","334vbn","445das"),
      Array("221bca","321dsa"),
      Array("231dsa","653asd","698poq","897qwa")
    )

    )
    )
    以下应该做你想要的:

    val output: RDD[(String,String)] =
    input.flatMap { arrArrStr: Array[Array[String]] =>

    arrArrStr.flatMap { arrStrs: Array[String] =>
      arrStrs.tail.map { value => arrStrs.head -> value }
    }

    }
    事实上,由于flatMap/ map是如何编写的,你可以将其重新编写为for-comprehension:

    val output: RDD[(String,String)] =
    for {

    arrArrStr: Array[Array[String]] <- input
    arrStr: Array[String] <- arrArrStr
    str: String <- arrStr.tail

    } yield (arrStr.head -> str)
    你选择哪一个最终是个人偏好的问题(虽然在这种情况下,我更喜欢后者,因为你不必像往常一样缩进代码)。

    验证:

    output.collect().foreach(println)
    应打印出来:

    (122abc,223cde)
    (122abc,334vbn)
    (122abc,445das)
    (221bca,321dsa)
    (231dsa,653asd)
    (231dsa,698poq)
    (231dsa,897qwa)

    2019-07-17 23:20:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Just Enough Scala for Spark 立即下载
JDK8新特性与生产-for“华东地区scala爱好者聚会” 立即下载
低代码开发师(初级)实战教程 立即下载