ODBC连接,在R中获取一个表

时间:2018-03-02 15:06:43

标签: sql r odbc r-dbi

在这个问题上挣扎了一整天:

我想访问Hadoop上的数据(通过Hive)。并安装了ODBC包。

我可以与服务器建立连接:

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

我能够在R中看到我想要的表格:

dblistTables(con, schema= "aacs") 

输出结果为:

   [1] "dev_1"                  "dev_2"     
   [3] "dev_3"                  "dev_4"

我希望在我的R环境中拥有“dev_4”(在数据框中)。我试过了:

db_orders <- tbl(con, "dev_4")

但是我收到了一个错误:找不到表或视图。下一行也没有任何结果。

db_orders <- tbl(con, "aacs.dev_4")

如何在R环境中获取该数据表?

编辑1

试图运行接下来的两件事:

result <- dbSendQuery(con, "SELECT * FROM aacs.dev_4")

收到错误:设备上没有剩余空间。

好的,那么让我们减少查询:

result <- dbSendQuery(con, "SELECT * FROM aacs.dev_4 LIMIT 100")

但同样的错误:

Error: <SQL> 'SELECT * FROM aacs.dev_4 limit 100'
  nanodbc/nanodbc.cpp:1587: HY000: [Hortonworks][Hardy] (35) Error from server: error code: '2' error message: 'Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Reducer 2, vertexId=vertex_15177720341_0081_2_08, diagnostics=[Task failed, taskId=task_15177723341_0081_2_08_000146, diagnostics=[TaskAttempt 0 failed, info=[Error: FS Error in Child JVM:org.apache.hadoop.fs.FSError: java.io.IOException: No space left on device
    at org.apache.hadoop.fs.RawLocalFileSystem$LocalFSFileOutputStream.write(RawLocalFileSystem.java:261)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.write(FSDataOutputStream.java:58)
    at java.io.DataOutputStream.write(DataOutputStream.java:107)
    at org.apache.tez.runtime.library.common.sort.impl.IFileOutputStream.write(IFil

任何人都知道如何解决这个问题?奇怪的是没有内存......因为我有足够的空间(足以存储数据!)。

编辑2

正如@Florian所说:

data <- dbReadTable(con, "aacs.dev_4") 

导致下一个错误:

Error: <SQL> 'SELECT * FROM `aacs.dev_4`'
  nanodbc/nanodbc.cpp:1587: HY000: [Hortonworks][Hardy] (35) Error from server: error code: '2' error message: 'Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.tez.TezTask. Vertex failed, vertexName=Reducer 2, vertexId=vertex_1517772023341_0082_1_08, diagnostics=[Task failed, taskId=task_1517772023341_0082_1_08_000236, diagnostics=[TaskAttempt 0 failed, info=[Error: exceptionThrown=org.apache.tez.runtime.library.common.shuffle.orderedgrouped.Shuffle$ShuffleError: error in shuffle in fetcher {Map_4} #10
    at org.apache.tez.runtime.library.common.shuffle.orderedgrouped.Shuffle$RunShuffleCallable.callInternal(Shuffle.java:360)
    at org.apache.tez.runtime.library.common.shuffle.orderedgrouped.Shuffle$RunShuffleCallable.callInternal(Shuffle.java:337)
    at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)
    at java.util.concurrent.FutureTask.run(FutureTask.java

3 个答案:

答案 0 :(得分:2)

尝试

x <- dbReadTable(con, "dev_4")

完整的工作示例:

library(DBI)
library(RSQLite)

con <- dbConnect(RSQLite::SQLite(), ":memory:")

dbListTables(con)
dbWriteTable(con, "mtcars", mtcars)
x <- dbReadTable(con, "mtcars")

希望这有帮助!

答案 1 :(得分:0)

我知道出了什么问题......

视图中有错误(&#34; dev_4&#34;)。因为当我运行代码时:

test <- dbReadTable(con, "dev_3") 

我收到了返回的数据框。是时候与数据工程师联系了......谢谢你的帮助!

答案 2 :(得分:0)

我认为你在寻找

data<- dbGetQuery(con,"SELECT * FROM aacs.dev_4 LIMIT 100")