如何从 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 中的单个列派生多个列并在新列上分组 [重复]
如何引发异常以退出 Synapse Apache Spark 笔记本
Apache Spark - 如何从两个 RDD 中获取不匹配的行