我一直在尝试编写一个R脚本来查询Impala数据库。以下是对数据库的查询:
select columnA, max(columnB) from databaseA.tableA where columnC in (select distinct(columnC) from databaseB.tableB ) group by columnA order by columnA
当我手动运行此查询时(读取:通过impala-shell在Rscript之外),我可以获取表内容。但是,当通过R脚本尝试相同时,我收到以下错误:
[1] "HY000 140 [Cloudera][ImpalaODBC] (140) Unsupported query."
[2] "[RODBC] ERROR: Could not SQLExecDirect 'select columnA, max(columnB) from databaseA.tableA where columnC in (select distinct(columnC) from databaseB.tableB ) group by columnA order by columnA'
closing unused RODBC handle 1
为什么在通过R尝试时查询失败?我该如何解决这个问题?在此先感谢:)
修改1:
连接脚本如下所示:
library("RODBC");
connection <- odbcConnect("Impala");
query <- "select columnA, max(columnB) from databaseA.tableA where columnC in (select distinct(columnC) from databaseB.tableB ) group by columnA order by columnA";
data <- sqlQuery(connection,query);
答案 0 :(得分:0)
您需要安装相关的驱动程序,请查看以下link
我有同样的问题,我所要做的就是更新ODBC驱动程序。
此外,如果您可以使用用户名和密码更新odbcConnect
connection <- odbcConnect("Impala");
到
connection <- odbcConnect("Impala", uid="root", pwd="password")
答案 1 :(得分:0)
这也可能是由于您的sql查询本身存在错误。例如,当我在以下广义语句中错过“ in”时,我得到了此错误。示例:
stringstuff <- someDT$columnyouwanttouse
somestring <- toString(sprintf("'%s'", stringstuff))
RESULTS <- sqlQuery(con, paste0("select
fling as flam
and toot **in** (",somestring,")
limit 30
;"))
我遗漏了'in'时遇到的错误,因此请仔细检查您的语法。
答案 2 :(得分:0)
如果数据库中不存在该表,则会出现此错误消息。
一些明智的检查:
答案 3 :(得分:0)
RODBC程序包很古怪:如果查询执行中没有更新/删除任何行,则会抛出错误。
因此,在使用sqlDelete
删除行或使用sqlUpdate
更新值之前,请先检查是否至少有一行要通过查询COUNT(*)
来删除/更新。
对于Oracle SQL 12g,执行检查后没有问题。
另一种选择是将临时表用于新一批数据,并使用sqlQuery
执行MERGE
命令。如果合并了零行,则RODBC不会抱怨。