【问题标题】:R. Big Query. Replace SQL with dplyrR. 大查询。用 dplyr 替换 SQL
【发布时间】:2021-12-12 04:34:55
【问题描述】:

我的代码运行良好,如下所示:

sql <- paste0("
SELECT
  date
  , dimension2
  , landingPagePath
  , source
  , medium
  , campaign
  , keyword
  , adContent
FROM
  `project_id.google_analytics.ga_cid_sessions`
WHERE 
  DATE(date) > cast('"
  , today()-30
  ,"' as date)
")
table_bq_cid_sessions <- bq_project_query(bq_project, sql)
bq_cid_sessions <- bq_table_download(table_bq_cid_sessions)

我希望用 dplyr 替换它并尝试:

bq_cid_sessions <- select(
  bq_tbl_ga_cid_sessions
  , c(date, dimension2)
  ) %>% 
  filter(date >=  today()-30) %>%
  collect()

但有错误:

Ошибка: Job 'project_id.job_xxxxxxxxxxx.US' failed
x No matching signature for operator - for argument types: DATE, FLOAT64. Supported signatures: INT64 - INT64; NUMERIC - NUMERIC; BIGNUMERIC - BIGNUMERIC; FLOAT64 - FLOAT64; DATE - INT64; DATE - DATE; TIMESTAMP - TIMESTAMP; DATETIME - DATETIME; TIME - TIME; TIMESTAMP - INTERVAL; DATE - INTERVAL; DATETIME - INTERVAL; INTERVAL - INTERVAL at [4:28] [invalidQuery]

我做错了什么?

【问题讨论】:

  • 似乎today()-30 正在返回 FLOAT64。是lubridate::today() 吗?如果你使用filter(date &gt;= as.Date(today())-30) %&gt;%,它会解决吗?
  • 我试过你的代码,它对我来说很好用。我使用了lubridate::today() 并检查了today()-30 返回一个日期。我正在使用lubridate_1.8.0 和R version 4.1.1。你使用的是什么版本的 R 和 lubridate?
  • @JonSpring,对不起,是的,它是润滑的。 @RiccoD,相同版本的包和 R。我现在看到,在 BigQuery 中的日期为 STRING。使用 dplyr 选择时如何转换它?
  • 或许filter(as.Date(date) &gt;= today()-30)

标签: r dplyr google-bigquery


【解决方案1】:

关于我对 today()-30 的评论有效,这是不正确的,因为当我测试它时,我将 BQ 表转换为数据框,这就是它有效的原因。

为了纠正我的测试,我现在使用了tbl(my_bq_connection, "table_name")。为了能够正确比较日期计算,today()-30 不应包含在select() 中。 BigQuery 将其解释为 DATE - FLOAT 因此错误。解决方法是移出today()-30 并在select() 中使用today()-30 的结果。将 date 和结果都转换为 DATE 以确保两者都是 DATE 类型。

为了测试,我使用了这张表:

见R代码:

library(bigrquery)
library(dplyr)
library(tidyverse)
library(lubridate)

projectid<-"project-id"
datasetid<-"dataset"
bq_conn <- dbConnect(bigquery(),
project = projectid,
dataset = datasetid,
use_legacy_sql = FALSE)

test_tb <-tbl(bq_conn, "test_1")
com_date <- today() - 30
test_query <- select(test_tb,c(date,B2)) %>% filter(as.Date(date) >= as.Date(com_date))
test_query

在 BQ 中生成的查询(见查询历史):

R 中的输出:

# Source:   lazy query [?? x 2]
# Database: BigQueryConnection
  date          B2
  <chr>      <int>
1 2021-09-30   165

【讨论】:

  • 有效!太好了,谢谢
  • @АндрейБуланкин 您可以将其标记为已回答,以便参考其他遇到相同问题的人。见What should I do when someone answers my question。
  • 我的声望不够=\
  • @АндрейБуланкин 您可以通过单击答案左侧的复选图标将答案标记为已接受。
猜你喜欢
  • 2021-12-26
  • 2018-06-08
  • 2012-06-18
  • 2018-07-21
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多