如何从 Apache Spark 中的单个文件记录创建多个 RDD 行

Posted

技术标签:

【中文标题】如何从 Apache Spark 中的单个文件记录创建多个 RDD 行【英文标题】:How to create multiple RDD rows from a single file record in Apache Spark 【发布时间】:2016-06-09 15:44:21 【问题描述】:

我正在使用 Apache Spark 处理以下逻辑。我的输入文件具有以下格式的行,以管道分隔:

14586|9297,0.000128664|9298,0.0683921
14587|4673,0.00730174
14588|9233,1.15112e-07|9234,4.80094e-05|9235,1.91492e-05|9236,0.00776722

第一列是一个键。之后可能会有一列或多列。每个后续列都有一个辅助键和一个值,如下所示:4673,0.00730174 在阅读这个文件时,我希望得到的 RDD 只有 3 列,在第一列之后将其他列展平,但保留主键,如下所示:

14586|9297,0.000128664
14586|9298,0.0683921
14587|4673,0.00730174
14588|9233,1.15112e-07
14588|9234,4.80094e-05
14588|9235,1.91492e-05
14588|9236,0.00776722

如何在 Scala 中做到这一点?

【问题讨论】:

【参考方案1】:

这就是你要找的东西吗?

val sc: SparkContext = ...
val rdd = sc.parallelize(Seq(
  "14586|9297,0.000128664|9298,0.0683921",
  "14587|4673,0.00730174",
  "14588|9233,1.15112e-07|9234,4.80094e-05|9235,1.91492e-05|9236,0.00776722"
)).flatMap  line =>
  val splits = line.split('|')
  val key = splits.head
  val pairs = splits.tail

  pairs.map  pair =>
    s"$key|$pair"
  


rdd collect() foreach println

输出:

14586|9297,0.000128664
14586|9298,0.0683921
14587|4673,0.00730174
14588|9233,1.15112e-07
14588|9234,4.80094e-05
14588|9235,1.91492e-05
14588|9236,0.00776722

【讨论】:

这正是我所需要的。非常感谢。【参考方案2】:

你考虑过使用 flatMap 吗?它允许您从单行输入创建多个 0-n 行。只需解析行并使用主行键的不同值重建行。

【讨论】:

米克,感谢您的建议。我试过了,但可能是犯了一个错误,没有得到想要的结果。你介意为此发布一个示例 Scala 代码吗? @Pawel 发布的代码在我看来还不错。显然,您不需要设置或拆除代码。

以上是关于如何从 Apache Spark 中的单个文件记录创建多个 RDD 行的主要内容,如果未能解决你的问题,请参考以下文章

从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]

Apache Spark 如何保留输出文本文件中的行顺序?

如何引发异常以退出 Synapse Apache Spark 笔记本

Apache Spark - 如何从两个 RDD 中获取不匹配的行

Apache Spark MLlib:如何从 PMML 导入模型

apache spark中的sortbykey