我需要读取~2,000个csv文件(~500GB),然后过滤数据并将它们绑定在一起。当我只阅读~15,000个文件时,我的代码有效,但当我读取~20,000个文件时,它会提示“R会话中止”。
memory.limit(80000)
ReadCustomer = function(x)
fread(x, encoding = "UTF-8", select = c("customer_sysno", "event_cat2")) %>%
filter(event_cat2 == "***") %>%
select(customer_sysno) %>%
rename(CustomerSysNo = customer_sysno) %>%
mutate(CustomerSysNo = as.numeric(CustomerSysNo)) %>%
filter(CustomerSysNo > 0)
CustomerData = rbindlist(lapply(FileList, ReadCustomer))
我尝试将fread(x, encoding = "UTF-8", select = c("customer_sysno", "event_cat2"))
替换为spark_read_csv(sc, "Data", x)
,但sparkR仍无效。
我怎样才能读取所有文件? Rcpp会帮忙吗?
答案 0 :(得分:0)
你知道从每个文件中获得多少行,你不能说? 您实际上将此问题视为一种简单的过滤练习;您只需要满足特定条件的customer_sysno列。你想用它做什么会影响你是否想要将它们合并在一起。
我建议打开一个输出文件并将每个新输出附加到它。然后,您有一个包含所有所需customer_sysno值的本地文件。然后,您可以根据您的使用案例浏览或采样。
如果满足event_cat2条件的行实际上是每个文件的一小部分,并且每个文件都很大,那么另一种方法是readLine通过它们,也许结合将结果附加到输出文件。这基本上要求R做一个像(g)awk很棒的工作,所以这可能是一个有用的预处理步骤,可以获得所需的数据。