Scala - RDD [string]到RDD [vector]

时间:2015-12-02 18:50:17

标签: scala apache-spark

我是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个原子。

其中:

  • 第一个属性只是告诉它是一个原子条目还是一个HEAD条目(每个只有一个HEAD条目 框架,它有一些系统属性/信息)
  • 第二个属性是“帧号”
  • 第三个属性是“原子ID /数字”
  • 第四个属性是“原子类型”
  • 第五,第六和第七属性是原子的位置向量(x,y,z)
  • 八个属性是原子的充电
  • 第九个属性是原子的质量。

我需要逐帧访问数据并从上面的数据计算一些东西,例如,

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]会起作用,但我不知道如何从该向量访问特定字段。

1 个答案:

答案 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文件,可用于较新的版本。