将数据框复制到 Impala 数据库时出错
Posted
技术标签:
【中文标题】将数据框复制到 Impala 数据库时出错【英文标题】:Error while copying data frame to Impala database 【发布时间】:2019-05-06 13:19:23 【问题描述】:我正在尝试将我的数据框结果复制到 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】:日期应该用引号括起来。您可以在插入之前转换列:
df$eventdate <- paste0("'", df$eventdate, "'")
或者,或者,
df$eventdate <- sQuote(df$eventdate)
否则会被识别为整数类型。
【讨论】:
谢谢。这行得通。我尝试了这个RJDBC::dbSendUpdate(conn, state1)
语句,它最初只上传了我的数据框的第一行,所以我使用lapply(state1, function(x) RJDBC::dbSendUpdate(conn, x))
更新了我的代码。但这需要花费大量时间来上传我的数据框,该数据框有 190 万行和 3 列。有关轻松上传整个数据框的更好方法的任何建议。
this 回答可能有助于提高效率(类似的mysql案例)以上是关于将数据框复制到 Impala 数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章
在 Cloudera Impala(虚拟机)中创建数据库时出错
尝试使用 pandas 数据框将数据附加到 BigQuery 表时出错