我是stackoverflow的新手。我需要帮助从“data.txt”文件(大小:1.84 GB)中以有组织的形式提取数据。我正在使用scala-2.10.4和spark-1.1.0。
data.txt的内容采用以下格式
ATOM 00000000 00000004 00000001 17.808 15.749 6.649 -0.548 15.9994
ATOM 00000001 00247690 00000002 20.9489 12.0511 5.4639 0.4238 1.008
data.txt文件中有大约300k个原子,每个帧中有相同的模式和大约286890个原子(第二个属性)。即,帧00000000包含286890个原子,帧00000001包含286890个原子。
其中:
我需要逐帧访问数据并从上面的数据计算一些东西,例如,
1.每帧的质量。公式:M =Σmi(i < - 1至n)
2.惯性的转动。公式:I =Σmiri(i < - 1到n) 还有一些类似的东西。
如您所见,我需要从data.txt中提取数据。 我用了,
val logFile = "/path/data.txt"
val logData = sc.textFile(logFile, 2).cache()
logData是一个RDD [string],我只能使用它来计算具有特定pettern的行数。 但是,我需要从每一帧得到每一行的第7个字段(即质量)来计算质量总和,我不知道该怎么做。
*我需要使用scala,不允许使用任何其他语言。
请帮我知道怎么做。 我想将其转换为RDD [vector]会起作用,但我不知道如何从该向量访问特定字段。
答案 0 :(得分:1)
首先,在尝试使用Spark解决问题之前,特别是在StackOverflow上发布问题之前,你真的需要学习一些关于Spark和函数式编程的知识 - 正如你从评论中看到的那样,当人们感到烦恼时,人们会感到恼火从一个问题中可以看出,在发布之前没有付出任何努力来学习基础知识。
也就是说,将文本/ csv文件转换为rdd
之前已经在SO上得到了回答(例如参见How do I convert csv file to rdd),所以看一下。获得类型为rdd
的{{1}}后,只需访问元素,就像访问数组中的元素一样。在下面的示例中,我将每一行映射到键值对,以说明如何访问数组的元素。我明白,你需要做一些计算,所以你可能需要使用另一个函数而不是RDD[Array[String]]
,但希望你能得到这个想法。
map
作为最后一点,我强烈建议您升级到Spark的最新版本(编写本文时为1.5.2),而不是使用像1.1.0这样的旧版本。自1.1.0开始,Spark发生了很多变化,像Databricks的spark-csv这样的软件包可以为你解析csv文件,可用于较新的版本。