Я пытаюсь записать таблицу в одну из моих баз данных, используя dbWriteTable, но столкнулся с множеством проблем. Это может быть связано со схемой или внутренним подключением к Impala, я не совсем уверен.
Я пробовал несколько вариантов команды dbWriteTable, пытаясь создать новую таблицу с именем test cars из набора данных mtcars в базе данных dbo, но ни одна из них не сработала. Удивительно, но я могу успешно использовать 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
В идеале я хотел бы записать свой набор данных из R в мою базу данных с помощью команды dbWriteTable, чтобы записать таблицу в базу данных dbo с именем таблицы test_car.