首页 > 解决方案 > Dbplyr 错误:将表达式转换为数据类型 int 的算术溢出错误

问题描述

我很确定已经问过类似的查询。但是,我的问题是特定于我何时将 R 会话连接到我的 SQL Server 数据库。

accept<-x%>% 

  group_by(SiteID, MachineID, LocationID) %>%

  filter(DateTime>="2019-01-1" & DateTime<"2019-12-31") %>%

  summarise(n=(sum(TenSecCount))) %>%

  collect()

当我尝试将数据收集到数据框中时,出现以下错误 -

将表达式转换为数据类型 int 时出现算术溢出错误。
'SELECT "SiteID", "MachineID", "LocationID", CAST("n" AS VARCHAR(MAX)) AS "n"
FROM (SELECT TOP 100 PERCENT "SiteID", "MachineID", "LocationID", (SUM( "TenSecCount")) AS "n"
FROM (SELECT TOP 100 PERCENT *
FROM (SELECT TOP 100 PERCENT "MachineID", "OutletID", "TenSecCount"

有什么解决方法吗?

标签: rdbplyr

解决方案


当您将数据收集到 R 中时会出现此错误,因为只有在收集时才会评估您的远程 SQL 表。

dbplyr 通过返回结果的 SQL 查询定义您的远程表。在您要求返回结果之前,您的远程表定义与等待运行的 SQL 脚本没有太大区别。

当您从该表请求结果时,在您的情况下collect,使用 sql 代码在服务器上执行并将结果返回给 R。这意味着您可能有一个无效的远程表定义,并且在您执行它之前不知道它。例如:

remote_table <- server_df %>% 
  group_by(SiteID, MachineID, LocationID) %>%
  filter(DateTime>="2019-01-1" & DateTime<"2019-12-31") %>%
  summarise(n=(sum(TenSecCount)))
# no error because all we have done is define an sql query and store it in remote_table

# review underlying sql query
show_query(remote_table)
# if you copy & paste this query and try to run it directly on the server it will error

# attempt to collect data
local_table <- remote_table %>% collect()
# error occurs on evaluation

您可以知道在评估 sql 时出现了错误,因为 R 向您返回了导致错误的 sql 代码和 sql 错误消息。“将表达式转换为数据类型 int 时出现算术溢出错误。” 是 SQL 错误,而不是 R 错误。有关解决问题的方法,请参阅此问题。

提示,可能类似于:

remote_table <- server_df %>% 
  mutate(TenSecCount = CAST(TenSecCount AS BIGINT)) %>% # additional step changing data type
  group_by(SiteID, MachineID, LocationID) %>%
  filter(DateTime>="2019-01-1" & DateTime<"2019-12-31") %>%
  summarise(n=(sum(TenSecCount)))

推荐阅读