2015-12-02 55 views
-4

我是stackoverflow的新手。我需要幫助從「data.txt」文件(大小:1.84 GB)以組織形式提取數據。我正在使用scala-2.10.4和spark-1.1.0。斯卡拉 - RDD [字符串]到RDD [矢量]

的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

有〜300K data.txt文件中的原子具有相同的模式,每個幀中的原子數大約爲286890個(第2個屬性)。即幀00000000包含286890個原子,並且幀00000001包含286890個原子。

其中:

  • 第一屬性只是告訴它是否是一個原子條目或HEAD條目(有每 幀只有一個HEAD條目和它有一些系統屬性/信息)
  • 第二屬性是「幀號」
  • 第三屬性是「原子ID /數」
  • 第四屬性是「原子類型」
  • 第五,第六和第七屬性噸原子的位置向量(x,y,z)
  • 八個屬性是原子的電荷
  • 第九個屬性是原子的質量。

我需要由幀從上述數據訪問數據幀,並計算幾件事情等,

1.Sum每一幀的塊。公式:M =Σmi(i < - 1至n)

2.慣性慣性。公式:我=Σmiri(我< - 1至n) 和幾個更類似的東西。如你所見,我需要從data.txt中提取數據。 我使用的,

val logFile = "/path/data.txt" 
    val logData = sc.textFile(logFile, 2).cache() 

logData是RDD [字符串],我只能用它來計算行數與特定pettern。 但是,我需要從每一幀中得到每一行(即,質量)的第7場來計算質量總和,這是我不知道該怎麼做的。

*我需要使用scala,不允許使用其他語言。

請幫我知道該怎麼做。 我想把它轉換成RDD [矢量]將工作,但我不知道如何訪問該矢量的特定字段。

+4

發佈您嘗試過的以及它失敗的方式。 – Daenyth

+2

你真的會問一些問題陳述的代碼! 。 – WoodChopper

+0

這樣一個小文件,你不需要使用Spark。代碼也會更簡單。 – kostya

回答

1

首先,在嘗試解決Spark問題之前,您真的需要學習一些關於Spark和函數式編程的知識,特別是在將問題發佈到StackOverflow之前 - 正如您從評論中看到的那樣,當人們討厭它時從發佈之前沒有投入到學習基礎知識的問題中可以明顯看出。

也就是說,將文本/ csv文件轉換爲rdd之前已經在SO上進行了回答(請參閱How do I convert csv file to rdd),因此請看一下。一旦你有你的類型RDD[Array[String]],你只需像訪問元素一樣訪問元素。在下面的例子中,我將每一行映射到一個鍵值對,以說明如何訪問數組的元素。我明白,你需要做一些計算,所以你可能需要使用另一個函數,而不是map,但希望你明白了。

val logData: RDD[Array[String]] = sc.textFile("/path/data.txt", 2).map(line => line.split(",") 

logData.map(a => (a.head, (a(1),a(2))) 

作爲最後一個音符,我會強烈建議您升級到星火的最新版本(1.5.2在寫這篇的時間),而不要使用舊版本像1.1.0。 Spark自1.1.0以來已經發生了很大變化,Databricks中的spark-csv軟件包將爲您解析csv文件,適用於較新的版本。