【问题标题】:bigrquery - Error: No matching signature for operator - for argument types: DATE, FLOAT64bigrquery - 错误:没有匹配的运算符签名 - 对于参数类型:DATE、FLOAT64
【发布时间】:2020-04-10 06:35:35
【问题描述】:

filter()ing 按日期并使用函数提供该日期时,我看到了预期的错误:

library(tidyverse)
library(bigrquery)

table1 %>% 
  filter(date > as.character(today() - 730)) %>% 
  tally()

# Error: No matching signature for operator - for argument types: DATE, FLOAT64. 
Supported signatures: INT64 - INT64; NUMERIC - NUMERIC; FLOAT64 - FLOAT64 at [29:29] [invalidQuery]

但是当日期作为字符串提供时,它可以正常工作

table1 %>%
  filter(date > '2018-04-11') %>% 
  tally()

#          n
#      <int>
#  623451234

我可以确认as.character(today() - 730)'2018-04-11' 是一样的

> identical(as.character(today() - 730), '2018-04-11')
[1] TRUE

以下解决方法可以,但对于较大的代码库会变得混乱:

date_from <- as.character(today() - 730)

table1 %>% 
  filter(date > date_from) %>% 
  tally()

问题

为什么当通过as.character(today() - 730) 之类的函数向filter() 提供日期时会看到错误,而当日期是通过字符串提供时却没有?

注意事项

  • 类似问题here
  • 我尝试将 as.character(today() - 730) 替换为 as.Date(today() - 730) 并得到完全相同的错误

【问题讨论】:

    标签: r dplyr dbplyr bigrquery


    【解决方案1】:

    您已使用dbplyr 对此进行了标记,尽管您的问题中没有提及它。如果您使用的是 dbplyr,那么问题出在 dbplyr 如何从 R 转换为数据库语言(在您的情况下为 bigquery)。

    dbplyr 有一系列内置翻译来进行转换(例如,filter 被翻译成 WHERE 子句)。这些翻译能够根据您的示例从变量中查找值:

    date_from <- as.character(today() - 730)
    table1 %>% filter(date > date_from)
    

    但不能告诉子函数是评估、翻译还是保持原样。因此,根据this 文档,dbplyr 保留任何“未知”功能。这意味着

    table1 %>% filter(date > as.character(today() - 730))
    

    可能会被翻译成类似的东西

    SELECT ...
    FROM ...
    WHERE date > as.character(today() - 730)
    

    这会导致错误,因为这不是数据库的有效语法。

    您可以使用show_query()查看翻译:

    table1 %>% filter(date > as.character(today() - 730)) %>% show_query()
    

    This question 提出了一个非常相似的问题——翻译是为他们正在使用的函数定义的,但不是为充当包装器的自定义函数定义的。能够定义自定义翻译将解决这两个问题,但目前这似乎是不可能的。

    有两种解决方法:

    1. 您可以从dbplyr documentation 使用sql() 插入原始SQL 字符串(不会被翻译)。
    2. 您可以编写自己的函数来返回自定义表定义。请参阅this answer 的“创建自定义函数”部分。

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2013-01-20
      • 1970-01-01
      • 2019-09-20
      相关资源
      最近更新 更多