使用dplyr和Unix时间戳过滤数据库

时间:2016-03-04 01:54:50

标签: r dplyr unix-timestamp

我正在使用大型数据库(通过dplyrimpaladb)和dplyr。因此,我需要按日期过滤所有这些都在Unix时间戳中给出。虽然我可以在本地将其转换为

time_t = as.Date(as.POSIXct(time_t/1000, origin = '1970-01-01', tz = 'UTC')))` 

与DB通信时不起作用;我需要将以下内容翻译成dplyr

dau <- bb %>%
  tbl(sql("SELECT
             device_token_s,
             to_date(from_unixtime(cast(collector_date_t/1000 as bigint))) AS dte
           FROM bb.sys_app_open
           WHERE 
             build_type_n = 1
             AND to_date(from_unixtime(cast(collector_date_t/1000 as bigint))) >=  '2016-02-26'
           GROUP BY 
             device_token_s,
             to_date(from_unixtime(cast(collector_date_t/1000 as bigint)))")) %>%
  collect()

我能得到的最接近的是,

dau.df <- bb %>% 
  tbl('sys_app_open') %>%
  select(device_token_s, 
         sql('to_date(from_unixtime(cast(collector_date_t/1000 as bigint))) AS dte')) %>%
  filter(build_type_n == 1, 
         sql("to_date(from_unixtime(cast(collector_date_t/1000 as bigint))) >=  '2016-02-26' ")) %>%
  #mutate(collector_date_t = sql('to_date(from_unixtime(cast(collector_date_t/1000 as bigint)))')) %>%
  group_by(device_token_s, sql('to_date(from_unixtime(cast(collector_date_t/1000 as bigint)))')) %>%
  collect()

但我收到了

Error: All select() inputs must resolve to integer column positions.
The following do not:
*  sql("to_date(from_unixtime(cast(collector_date_t/1000 as bigint))) as dte")

2 个答案:

答案 0 :(得分:0)

发布一个示例数据框。我有同样的问题;如果我看到数据框,就可以告诉您如何使用dplyr。

如果您无法快速执行此操作,建议您使用dbGetQuery(connection, "YOUR_SQL_QUERY")来获取数据。

答案 1 :(得分:0)

该错误来自您使用package.json函数的方式。您正在尝试通过select发送“文字” SQL指令,而应该通过select函数来实现。

这应该对您有用:

mutate

我建议您使用函数dau.df <- bb %>% tbl('sys_app_open') %>% select(device_token_s, build_type_n, collector_date_t) %>% mutate(dte = sql("to_date(from_unixtime(cast(collector_date_t/1000 as bigint)))")) %>% filter(build_type_n == 1, dte > '2016-02-26') %>% group_by(device_token_s, dte) %>% collect 来查看dbplyr::sql_render()正在创建的查询。例如,运行

dplyr

查看创建的以下查询:

bb %>% 
  tbl('sys_app_open') %>%
  select(device_token_s, build_type_n, collector_date_t) %>%
  mutate(dte = sql("to_date(from_unixtime(cast(collector_date_t/1000 as bigint)))")) %>%
  filter(build_type_n == 1, dte > '2016-02-26') %>%
  dbplyr::sql_render()