Scala Spark使用slidingRDD读取多行记录
我试图用spark处理一个文件,但我的输入文件有一条信息“记录”,分布在3行上Scala Spark使用slidingRDD读取多行记录,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我试图用spark处理一个文件,但我的输入文件有一条信息“记录”,分布在3行上 Rec1 Line1 Rec1 Line2 Rec1 Line3 Rec2 Line1 Rec2 Line2 Rec2 Line3 没有键链接记录的行,唯一的连接是它们是彼此相邻的三行。除了知道第四行是新记录的开始之外,没有记录分隔符。我看到的所有其他与多行记录相关的问题似乎都有某种明显的记录分隔符,而在这种情况下我没有,我必须依赖行数 我的第一个想法是使用org.apache.spark.mllib.rdd.RD
Rec1 Line1
Rec1 Line2
Rec1 Line3
Rec2 Line1
Rec2 Line2
Rec2 Line3
没有键链接记录的行,唯一的连接是它们是彼此相邻的三行。除了知道第四行是新记录的开始之外,没有记录分隔符。我看到的所有其他与多行记录相关的问题似乎都有某种明显的记录分隔符,而在这种情况下我没有,我必须依赖行数
我的第一个想法是使用org.apache.spark.mllib.rdd.RDDFunctions中的滑动
函数
sc.textFile("myFile.txt").sliding(3,3)
这将我的RDD[String]转换为和RDD[Array[String]],其中RDD中的每个元素与文件的距离为3行
在一些测试中,这看起来很有效,因为它可以得到我想要的结果,但是我注意到滑动
函数实际上会在求值过程中导致收集
。这让我担心,它在收集什么?是整个数据文件还是其他什么?我的文件太大,无法将整个内容收集到驱动程序上
滑动是读取此文件的最佳方法,还是有更有效的方法?您看到的collect()
调用不会收集所有RDD数据,而是收集分区摘要信息。调用.slideing
将导致额外读取文本文件以计算此信息,但不会导致耗尽驱动程序内存
我通过阅读spark 2.0.2中的org.apache.spark.mllib.rdd.SlidingRDD
中的代码了解到这一点
出于您的目的,
.slide
似乎是最好的选择。您不能使用rdd.map(.split(“”).map(arr=>(arr[0],arr[1])。groupBy(.\u 2)?这意味着按空格分割行,按键、值和分组创建rdd。@dumitru文件中没有要分组的键。我可以使用zipWithIndex
获取用于分组的键。这也会导致完全洗牌。