dbplyr的五位数摘要

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 %

我有4年使用R的经验,但我对大数据游戏非常陌生,因为我一直在处理csv文件

从远处操纵大量数据是一件令人兴奋的事情,但同时也会以某种方式挫败,因为你过去习惯的简单事情需要重新设计

我现在的任务是对一个变量进行5位数的基本汇总:

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" ...