将数据框复制到Impala数据库时出错

时间:2019-05-06 13:19:24

标签: r impala

我正在尝试将数据框结果复制到Impala DB。但是这样做时我遇到了错误。

library(RJDBC)
library(implyr)
drv <- JDBC("com.cloudera.impala.jdbc41.Driver","/User/ImpalaJDBC41.jar",identifier.quote="`")      
conn <- dbConnect(drv, "username/password")

RJDBC::dbWriteTable(conn, 'default.segments', df)

我遇到错误。

Error in .local(conn, statement, ...) : 
  execute JDBC update query failed in dbSendUpdate ([Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:AnalysisException: Syntax error in line 1:
...ents (id DOUBLE PRECISION,eventdate VARCH...
                         ^
Encountered: IDENTIFIER
Expected: BLOCK_SIZE, COMMENT, COMPRESSION, DEFAULT, ENCODING, INTERMEDIATE, LOCATION, NOT, NULL, PRIMARY, COMMA

CAUSED BY: Exception: Syntax error
), Query: CREATE TABLE default.segments (id DOUBLE 
PRECISION,eventdate VARCHAR(255),segment INTEGER).)

假设数据类型有问题。我通过指定数据类型然后将值插入数据库来创建表。

RJDBC::dbSendUpdate(conn, paste("CREATE TABLE default.segments (id bigint,eventdate timestamp, segment bigint)",";"))

state1 <- paste0("INSERT INTO default.segments VALUES (", apply(df, 1, function(x) paste(x, collapse = ",")), ")" )
RJDBC::dbSendUpdate(conn, state1)

这也给我有关数据类型的错误。

Error in .local(conn, statement, ...) : 
execute JDBC update query failed in dbSendUpdate ([Cloudera] 
[ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, 
SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, 
errorMessage:AnalysisException: Target table 
'default.segments' is incompatible with source expressions.
Expression '2016 - 5 - 29' (type: BIGINT) is not compatible with column 
'eventdate' (type: TIMESTAMP)
), Query: INSERT INTO default.segments VALUES (      3,2016- 
05-29, 79).)

下面是我的数据框的结构。

> str(df)
'data.frame':   19065 obs. of  3 variables:
$ id: num  3 3 3 69 102 102 102 102 102 102 ...
$ eventdate: Date, format: "2016-05-29" ...
$ segment: int  79 76 76 18 11 15 7 11 7 11 ...

在最后一个错误中,它显示为Expression '2016 - 5 - 29' (type: BIGINT) is not compatible with column 'eventdate' (type: TIMESTAMP),但我在数据框中的日期列为Date格式。那可能是什么问题呢?有人可以帮忙吗。

1 个答案:

答案 0 :(得分:0)

日期应用引号引起来。您可以在插入之前转换列:

df$eventdate <- paste0("'", df$eventdate, "'")

df$eventdate <- sQuote(df$eventdate)

否则,它将被识别为整数类型。