dbplyr的五位数摘要
我有4年使用R的经验,但我对大数据游戏非常陌生,因为我一直在处理csv文件 从远处操纵大量数据是一件令人兴奋的事情,但同时也会以某种方式挫败,因为你过去习惯的简单事情需要重新设计 我现在的任务是对一个变量进行5位数的基本汇总:dbplyr的五位数摘要,r,impala,summary,dbplyr,R,Impala,Summary,Dbplyr,我有4年使用R的经验,但我对大数据游戏非常陌生,因为我一直在处理csv文件 从远处操纵大量数据是一件令人兴奋的事情,但同时也会以某种方式挫败,因为你过去习惯的简单事情需要重新设计 我现在的任务是对一个变量进行5位数的基本汇总: summary(df$X) 在某些情况下,我与黑斑羚有关,这些代码行工作正常: library(dbplyr) localTable <- tbl(con, 'serverTable') localTable %>% tally() localTable %
summary(df$X)
在某些情况下,我与黑斑羚有关,这些代码行工作正常:
library(dbplyr)
localTable <- tbl(con, 'serverTable')
localTable %>% tally()
localTable %>% filter(X > 10) %>% tally()
相反,RStudio会被卡住/占用很多时间,因此我使用任务管理器抑制它
回到我当前的问题,我试图通过以下方式得到一个5位数的摘要:
summary(localTable$X) #returns Length 0, Class NULL, Mode NULL
localTable %>% fivenum(X) #returns Error in rank(x, ties.method = "min", na.last = "keep") : unimplemented type 'list' in 'greater'
还使用summary生成自定义summary()
localTable %>% summarize(Min = min(X),
Q1 = quantile(X, .25),
Avg = mean(X),
Q3 = quantile(X, .75),
Max = max(X))
返回一个语法错误
我的猜测是,我的代码和服务器之间以数据结构的形式缺少一个非常微小的链接,但我不知道是什么
我还尝试将localTable$x保存到内存中的变量
XL <- localTable$X
我得到一张空的图片
我曾考虑过利用boxplot函数中的5位数摘要,也就是说ggplotbuild(object)$data,但使用dbplot\u boxplot时,我得到的错误是找不到函数“dbplot\u boxplot”
我开始使用dbplyr是因为我对dplyr非常熟练,我不想用DBI::dbGetQuery在SQL中编写查询,但是你可以推荐其他包,比如implyR、sparklyR或类似的包,以及关于这个主题的教程,因为我发现这些都是非常基本的
编辑:
根据评论中的要求,我添加了以下结果:
str(localTable)
那是
List of 2
$ src:List of 2
..$ con :Formal class 'Impala' [package ".GlobalEnv"] with 4 slots
.. .. ..@ ptr :<externalptr>
.. .. ..@ quote : chr "`"
.. .. ..@ info :List of 15
.. .. .. ..$ dbname : chr "IMPALA"
.. .. .. ..$ dbms.name : chr "Impala"
.. .. .. ..$ db.version : chr "2.9.0-cdh5.12.1"
.. .. .. ..$ username : chr "User"
.. .. .. ..$ host : chr ""
.. .. .. ..$ port : chr ""
.. .. .. ..$ sourcename : chr "impala connector"
.. .. .. ..$ servername : chr "Impala"
.. .. .. ..$ drivername : chr "Cloudera ODBC Driver for Impala"
.. .. .. ..$ odbc.version : chr "03.80.0000"
.. .. .. ..$ driver.version : chr "2.6.11.1011"
.. .. .. ..$ odbcdriver.version : chr "03.80"
.. .. .. ..$ supports.transactions : logi FALSE
.. .. .. ..$ getdata.extensions.any_column: logi TRUE
.. .. .. ..$ getdata.extensions.any_order : logi TRUE
.. .. .. ..- attr(*, "class")= chr [1:3] "Impala" "driver_info" "list"
.. .. ..@ encoding: chr ""
..$ disco: NULL
..- attr(*, "class")= chr [1:4] "src_Impala" "src_dbi" "src_sql" "src"
$ ops:List of 2
..$ x : 'ident' chr "serverTable"
..$ vars: chr [1:157] "X" ...
..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
- attr(*, "class")= chr [1:5] "tbl_Impala" "tbl_dbi" "tbl_sql" "tbl_lazy" ...
2人名单
$src:2人名单
..$con:4个插槽的正式类“黑斑羚”[package.GlobalEnv”]
.. .. ..@ ptr:
.. .. ..@ 引号:chr“`”
.. .. ..@ 信息:15人名单
.. .. .. ..$ 数据库名称:chr“黑斑羚”
.. .. .. ..$ dbms.name:chr“Impala”
.. .. .. ..$ 数据库版本:chr“2.9.0-cdh5.12.1”
.. .. .. ..$ 用户名:chr“用户”
.. .. .. ..$ 主持人:chr“”
.. .. .. ..$ 端口:chr“”
.. .. .. ..$ sourcename:chr“impala连接器”
.. .. .. ..$ 服务器名:chr“Impala”
.. .. .. ..$ drivername:chr“用于Impala的Cloudera ODBC驱动程序”
.. .. .. ..$ odbc.version:chr“03.80.0000”
.. .. .. ..$ driver.version:chr“2.6.11.1011”
.. .. .. ..$ odbcdriver.version:chr“03.80”
.. .. .. ..$ supports.transactions:logi FALSE
.. .. .. ..$ getdata.extensions.any_列:logi TRUE
.. .. .. ..$ getdata.extensions.any_顺序:logi TRUE
.. .. .. ..- 属性(*,“类”)=chr[1:3]“黑斑羚”“驾驶员信息”列表
.. .. ..@ 编码:chr“”
..$disco:NULL
..-attr(*,“class”)=chr[1:4]“src_Impala”“src_dbi”“src_sql”“src”
$ops:2人名单
..$x:'ident'chr“serverTable”
..$vars:chr[1:157]“X”。。。
..-attr(*,“class”)=chr[1:3]“op_base_remote”“op_base”“op”
-attr(*,“class”)=chr[1:5]“tbl_Impala”“tbl_dbi”“tbl_sql”“tbl_lazy”。。。
我不确定我是否能输出我的表格,因为它是敏感信息你的帖子有很多方面。我将尝试解决主要问题 (1)您调用的
localTable
不是本地的。您拥有的是远程表的本地访问点。它是一个远程表,因为数据存储在数据库中,而不是R中
要将远程表复制到本地R内存中,请使用localTable=collect(remoteTable)
。小心使用这个。如果数据库中的表有很多GB,则传输到R的速度会很慢。此外,如果收集的数据库表大于R可用的ram,则会收到内存不足错误
我建议使用collect
将汇总结果移动到R中。在数据库中进行处理和汇总,然后将结果提取到R中。或者,使用remoteTable%%>%head(20)%%>%collect()
将前20行复制到R中
(2)表名$colname
不适用于远程表。在R中,$
符号允许您访问列表的命名组件。Data.frames是一种特殊的列表。如果您尝试data(iris)
后跟names(iris)
,您将获得iris的列名称。可以使用iris$
访问其中任何一个
但是,正如您的str(localTable)
所示,localTable
是一个长度为2的列表,其中第一个命名项src
。如果您调用names(localTable)
,那么您将收到两个返回的名称,第一个是src
。这意味着您可以调用localTable$src
(由于localTable$src
也是一个列表,您也可以调用localTable$src$con
)
使用dbplyr时,R将数据操作命令转换为数据库语言。大多数dplyr命令都定义了翻译,但并非所有R命令都定义了翻译
因此,建议只访问特定列的方法是使用dplyr中的select
:
local\u copy\u of_just\u one\u column=remoteTable%>%
选择(必选列)%>%
收集
(3)您使用自定义摘要功能的方法是正确的。这是在不将数据拉入本地内存(RAM)的情况下生成五位数摘要的最佳方法
语法错误的一个可能原因是您使用的R命令没有翻译成数据库语言
您可以检查命令是否使用translate\u sql
定义了翻译。我建议你试试
库(dbplyr)
翻译sql(分位数(colname,0.25))
str(localTable)
List of 2
$ src:List of 2
..$ con :Formal class 'Impala' [package ".GlobalEnv"] with 4 slots
.. .. ..@ ptr :<externalptr>
.. .. ..@ quote : chr "`"
.. .. ..@ info :List of 15
.. .. .. ..$ dbname : chr "IMPALA"
.. .. .. ..$ dbms.name : chr "Impala"
.. .. .. ..$ db.version : chr "2.9.0-cdh5.12.1"
.. .. .. ..$ username : chr "User"
.. .. .. ..$ host : chr ""
.. .. .. ..$ port : chr ""
.. .. .. ..$ sourcename : chr "impala connector"
.. .. .. ..$ servername : chr "Impala"
.. .. .. ..$ drivername : chr "Cloudera ODBC Driver for Impala"
.. .. .. ..$ odbc.version : chr "03.80.0000"
.. .. .. ..$ driver.version : chr "2.6.11.1011"
.. .. .. ..$ odbcdriver.version : chr "03.80"
.. .. .. ..$ supports.transactions : logi FALSE
.. .. .. ..$ getdata.extensions.any_column: logi TRUE
.. .. .. ..$ getdata.extensions.any_order : logi TRUE
.. .. .. ..- attr(*, "class")= chr [1:3] "Impala" "driver_info" "list"
.. .. ..@ encoding: chr ""
..$ disco: NULL
..- attr(*, "class")= chr [1:4] "src_Impala" "src_dbi" "src_sql" "src"
$ ops:List of 2
..$ x : 'ident' chr "serverTable"
..$ vars: chr [1:157] "X" ...
..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
- attr(*, "class")= chr [1:5] "tbl_Impala" "tbl_dbi" "tbl_sql" "tbl_lazy" ...