2016-09-24 119 views
6

我在這裏的「大數據處理」裏面比較新,希望能找到一些關於如何處理50 GB csv文件的建議。目前的問題是以下幾點:如何處理r語言中的50GB大型csv文件?

表看起來像是:

ID,Address,City,States,... (50 more fields of characteristics of a house) 
1,1,1st street,Chicago,IL,... 
# the first 1 is caused by write.csv, they created an index raw in the file 

我想找到屬於是加利福尼亞州舊金山的所有行它應該是一個簡單的問題,但是csv太大了。

我知道我有R中做這件事的兩種方式,並另一種方式來使用數據庫來處理:

(1)基於R的ffdf包:

自最後一次保存文件,它正在使用write.csv,它包含所有不同的類型。

all <- read.csv.ffdf(
    file="<path of large file>", 
    sep = ",", 
    header=TRUE, 
    VERBOSE=TRUE, 
    first.rows=10000, 
    next.rows=50000, 
) 

控制檯使我這個:

Error in ff(initdata = initdata, length = length, levels = levels, ordered = ordered, 
: vmode 'character' not implemented 

通過網上搜索,我發現了幾個答案這不適合我的情況,我真的不能做「性格」的如何轉移的意義進入他們提到的「因素」類型。

然後我試着用read.table.ffdf,這更是災難。我無法找到一個堅實的指導。

(2)基於R的的ReadLine:

我知道這又是一個好辦法,但無法找到一個effecient的方式來做到這一點。

(3)使用SQL:

我不知道如何將文件傳輸到SQL版本,以及如何處理這個問題,如果有一個很好的指導,我想試試。但總的來說,我想堅持R.

感謝您的回覆和幫助!

+0

看看[這個答案](http://stackoverflow.com/questions/23197243/how-do-i-read-only-lines-that-fulfil-a-condition-from-a-csv-into- r)有幫助。 –

+1

在v。類似的脈絡^ ^鏈接http://stackoverflow.com/questions/26861951/using-read-csv-sql-to-select-multiple-values-from-a-single-column – user20650

+0

虐待檢查出來謝謝! – windsound

回答

8

你可以在窗口後面用sqldf包使用R和SQLite。您可以使用sqldf包中的read.csv.sql函數,然後您可以查詢數據,但是您希望獲得較小的數據幀。

該示例從文檔:

library(sqldf) 

iris2 <- read.csv.sql("iris.csv", 
    sql = "select * from file where Species = 'setosa' ") 

我已經使用上有良好的效果非常大的CSV文件,這個庫。

+1

謝謝我檢查出來!目前我遇到的問題還涉及到大數據文件中額外的索引列,read.csv.sql可以處理它嗎? :D – windsound

+1

目前我遇到的問題還涉及到大數據文件中額外的索引列,有沒有辦法解決這個問題?現在它告訴我,如果從第二行開始,它比第一行多1個字段.. – windsound

+0

@windsound我不確定我是否準確遵循,但聽起來像您的CSV文件可能沒有每個記錄具有一致的數字或列記錄。你將不得不實驗數據。您可能需要刪除該問題行,但是如果您的CSV數據未被引用,並且您的地址數據或其他字段中包含逗號,則您將繼續遇到問題,並且可能需要重新生成數據,使用帶引號的字段。希望有所幫助。在read.csv.sql函數中,有一個可以設置爲T/F的引用參數 - 取決於您的數據。祝你好運! –

3

這是太長的評論。

R - 在其基本配置中 - 將數據加載到內存中。內存很便宜。 50 GB仍然不是一種典型的配置(並且您需要更多的數據來加載和存儲數據)。如果你在R方面非常出色,你可能會找出另一種機制。如果你有權訪問集羣,你可以使用一些平行版本的R或者Spark。

您也可以將數據加載到數據庫中。對於手頭的任務來說,數據庫非常適合這個問題。 R可以輕鬆連接到幾乎任何數據庫。而且,您可能會發現一個數據庫對於您想要執行的操作非常有用。

或者,您可以在原地處理文本文件。命令行工具(如awk,grep和perl)非常適合執行此任務。我會建議這種方法進行一次性的努力。如果您想保留數據用於分析目的,我會推薦一個數據庫。

+1

我第二個建議使用awk或grep!對於這樣的單個查詢,您將在幾分鐘內完成。 – vincentmajor

+1

@GordonLinoff,你對R和Spark的建議也是不錯的。我已經在AWS上使用它來破解大約4TB的二進制文件,並且用它來處理它! –

+0

我現在明白了,只是需要一段時間才能意識到這是一個數據庫類型的事情,因爲之前,R正在處理10GB數據表......並且非常感謝您的評論! – windsound