我正在使用大型数据库(通过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")
答案 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()