2016-09-24 123 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