如何在后端使用Impala连接修复dbWriteTable“错误:无法取消引用dbo.test_cars”?

时间:2019-05-01 06:00:23

标签: r dplyr odbc rodbc r-dbi

我正在尝试使用dbWriteTable在我的数据库中编写一个表,但是遇到了各种各样的问题。我可能不确定,这可能是由于架构或与Impala的后端连接所致。

我尝试了dbWriteTable命令的几种变体,试图从dbo数据库中的mtcars数据集创建一个名为test cars的新表,但是没有一个起作用。出乎意料的是,尽管我能够成功地使用dbCreateTable从我的数据集中创建一个具有列名的空表。查看下面我尝试过的内容:

library(odbc)
library(implyr)
library(dplyr)
library(DBI)

impala_con <- dbConnect(odbc::odbc(),
                        Driver = "impala", 
                        Host = "host",
                        Port = "21050")

#impala_con
#<OdbcConnection> User@Impala
# Database: IMPALA
# Impala Version: 2.11.0-cdh5.14.0


> table_id = DBI::Id(schema = "dbo", name = "test_cars")

> dbWriteTable(  impala_con, name=table_id, as.data.frame(data(mtcars)))
Error: Can't unquote `dbo`.`test_cars`

> dbWriteTable(  impala_con, name=SQL("dbo.test_cars"), as.data.frame(data(mtcars)))
Error: Can't unquote dbo.test_cars


> dbWriteTable(  impala_con, name="dbo.test_cars", mtcars)
Error: <SQL> 'CREATE TABLE `dbo.test_cars` (
  `row_names` STRING,
  `mpg` DOUBLE,
  `cyl` DOUBLE,
  `disp` DOUBLE,
  `hp` DOUBLE,
  `drat` DOUBLE,
  `wt` DOUBLE,
  `qsec` DOUBLE,
  `vs` DOUBLE,
  `am` DOUBLE,
  `gear` DOUBLE,
  `carb` DOUBLE
)
'
  nanodbc/nanodbc.cpp:1587: 42000: [Cloudera][ImpalaODBC] (360) Syntax error occurred during query execution: [HY000] : AnalysisException: Invalid table/view name: dbo.test_cars

#The following command creates an empty table with the appropriate columns.

> dbCreateTable(  impala_con, SQL("dbo.test_cars"), mtcars)

#There are multiple databases in the system
#Was able to switch to appropriate database and now getting a different error

#As suggested switch database first and then try dbWriteTable

> dbSendQuery(impala_con, paste("use dbo"))
<OdbcResult>
  SQL  use dbo
  ROWS Fetched: 0 [complete]
       Changed: 0

> dbWriteTable(impala_con, name="test_cars", mtcars, overwrite=TRUE)
Error: <SQL> 'INSERT INTO `test_cars` (`row_names`, `mpg`, `cyl`, `disp`, `hp`, `drat`, `wt`, `qsec`, `vs`, `am`, `gear`, `carb`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
  nanodbc/nanodbc.cpp:1587: 42000: [Cloudera][ImpalaODBC] (360) Syntax error occurred during query execution: [HY000] : AnalysisException: Syntax error in line 2:
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
        ^
Encountered: Unexpected character
Expected: CASE, CAST, DEFAULT, EXISTS, FALSE, IF, INTERVAL, NOT, NULL, REPLACE, TRUNCATE, TRUE, IDENTIFIER

CAUSED BY: Exception: Syntax error

In addition: Warning message:
In new_result(connection@ptr, statement) : Cancelling previous query

> head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1


理想情况下,我想使用dbWriteTable命令将R中的数据集写入数据库,以将表名称为test_car的表写入数据库dbo中。

0 个答案:

没有答案