在 EC2 服务器上分析 R 中的大数据

Posted

技术标签:

【中文标题】在 EC2 服务器上分析 R 中的大数据【英文标题】:Analyze big data in R on EC2 server 【发布时间】:2020-02-03 16:17:59 【问题描述】:

我设法将我从我的 RStudio 实例(在 EC2 服务器上)获得的 6 个繁重的 excel 文件加载并合并到 PostgreQSL 中的一个表中(与 RDS 链接)。

现在这个表有 14 列和 2,4 百万行。PostgreSQL 中的表大小为 1059MBEC2 实例是 t2.medium

我想分析它,所以我想我可以简单地加载带有DBI包的表并对其执行不同的操作。

所以我做到了:

my_big_df <- dbReadTable(con, "my_big_table")
my_big_df  <- unique(my_big_df)

我的 RStudio 卡住了,内存不足...

我的问题是: 1)我一直在做的(处理这样的大桌子)是一个好的/好的做法吗? 2) 如果 1) 是,是唯一能够执行unique() 操作或其他类似操作来增加 EC2 服务器内存的方法吗? 3)如果2)是,我怎么知道我应该在多大程度上增加EC2服务器内存?

谢谢!

【问题讨论】:

在数据库上运行查询而不是将整个表读入内存? 但我需要使用 SQL 查询,不是吗?即使有这么大的容量,我也不能继续使用 R 吗? 是的,查询 postgresql 数据库需要 SQL 查询。如果您不能使用 SQL,请尝试使用更大的 EC2 实例... 【参考方案1】:

dbReadTable 将整个表转换为data.frame,对于这么大的表,这不是您想要做的。

正如@cory 告诉您的,您需要使用SQL 查询来提取所需的信息。 您可以通过 DBI 使用 dbSendQuerydbBinddbFetchdbGetQuery 的组合来做到这一点。

例如,您可以定义一个函数来获取所需的数据

filterBySQLString <- function(databaseDB,sqlString)
    sqlString <- as.character(sqlString)
    dbResponse <- dbSendQuery(databaseDB,sqlString)
    requestedData <- dbFetch(dbResponse)
    dbClearResult(dbResponse)

    return(requestedData)


# write your query to get unique values
SQLquery <- "SELECT * ...
             DISTINCT  ..."

my_big_df <- filterBySQLString(myDB,SQLquery)
my_big_df  <- unique(my_big_df)

如果您不能使用SQL,那么您有两种选择:

1) 停止使用 Rstudio 并尝试从终端或通过Rscript 运行您的代码。

2) 增强您的实例

【讨论】:

谢谢@fra!我想我需要习惯不使用 R 进行数据分析的想法......您知道其他可以使用 R 的解决方案吗,例如 Spark(作为 SparkR)?

以上是关于在 EC2 服务器上分析 R 中的大数据的主要内容,如果未能解决你的问题,请参考以下文章

Scala和Spark的大数据分析

Google Big Table与广告服务器数据分析的大查询

算法如何设计--高效的大数据匹配算法

在R中的大矩阵中添加连续的四个/ n个数字

如何根据 R 中的原始文件名将包含多个数据帧的大列表保存为单个 csv

在EC2上运行大数据集,担心存储