首页 > 解决方案 > in_schema 返回 2 的列表而不是 tbl

问题描述

我连接到我们的数据库:

con <- dbConnect(odbc::odbc(), "myHive")

我知道这个骗局正在工作,因为我可以在右上角的连接窗格中看到我们所有的模式。

如果我想选择一个特定的表作为 tbl 我可以去:

mytbl <- tbl(con, in_schema("mydb", "mytable"))

我希望这里的结果是 df 或 tbl 但它是 2 的列表。我试图提取 tbl 部分,但我被这个列表弄糊涂了。

这是str:

> str(mytbl)
List of 2
 $ src:List of 2
  ..$ con  :Formal class 'Hive' [package ".GlobalEnv"] with 4 slots
  .. .. ..@ ptr     :<externalptr> 
  .. .. ..@ quote   : chr "`"
  .. .. ..@ info    :List of 13
  .. .. .. ..$ dbname               : chr "HIVE"
  .. .. .. ..$ dbms.name            : chr "Hive"
  .. .. .. ..$ db.version           : chr "1.2.2"
  .. .. .. ..$ username             : chr ""
  .. .. .. ..$ host                 : chr ""
  .. .. .. ..$ port                 : chr ""
  .. .. .. ..$ sourcename           : chr "gdHive"
  .. .. .. ..$ servername           : chr "Hive"
  .. .. .. ..$ drivername           : chr "Hortonworks Hive ODBC Driver"
  .. .. .. ..$ odbc.version         : chr "03.52"
  .. .. .. ..$ driver.version       : chr "2.6.1.1001"
  .. .. .. ..$ odbcdriver.version   : chr "03.80"
  .. .. .. ..$ supports.transactions: logi FALSE
  .. .. .. ..- attr(*, "class")= chr [1:3] "Hive" "driver_info" "list"
  .. .. ..@ encoding: chr ""
  ..$ disco: NULL
  ..- attr(*, "class")= chr [1:3] "src_dbi" "src_sql" "src"
 $ ops:List of 2
  ..$ x   : 'ident_q' chr "mydb.mytable"
  ..$ vars: chr [1:188] "zzz1.order_id" "zzz1.row_id" "zzz1.order_ts" "zzz1.order_date" ...
  ..- attr(*, "class")= chr [1:3] "op_base_remote" "op_base" "op"
 - attr(*, "class")= chr [1:4] "tbl_dbi" "tbl_sql" "tbl_lazy" "tbl"

我在这里看什么?如何从 mydb.mytable 获取表作为 tbl?

标签: rdplyrdbplyr

解决方案


如果您希望将表加载到 R 内存中(而不是远程使用它),请使用mytbl %>% collect().

否则,我认为您正在查看的是标准远程表。这不是特别的in_schema。如果您尝试class(mytbl),您应该期望看到"tbl"它的类之一。

默认情况下,R 不会将远程表中的数据加载到内存中。要查看前几行,请尝试:mytbl %>% head()

您可以使用所有标准 dplyr 命令来操作表格。例如:

results = mytbl %>%
  rename(new_name = old_name) %>%
  mutate(new_col = 2*old_col) %>%
  group_by(new_col) %>%
  summarise(number = n()) %>%
  filter(number > 1000)

然后当你想要 R: 中的结果时results = results %>% collect()


推荐阅读