如何在 R 中使用 implyr 格式化日期?

How to format dates using implyr in R?

我正在使用 R 中的 implyr 包从 HDFS/Impala 收集数据。在 R 中收集数据之前,我想将 Impala 中当前格式为时间戳的字段格式化为 YYYYMM。这是我的代码:

library(implyr); library(dplyr) 
data %>%
    select(date_field) %>%
    mutate(yyyymm = as.Date(date_field, format = '%Y%m'))

注意: 我需要在 之前完成此操作以从 Impala.

收集

使用 show_query() 函数,我收到以下信息:

SELECT AS.DATE(date_field, '%Y%m' as "format") as yyyymm
FROM data
Warning message:
Named arguments ignored for SQL AS.DATE

由于 implyr 作为 Impala dplyr 的后端工作,我的问题是 - 有谁知道是否存在可以相应地格式化日期的代码 and 转换为可识别的 Impala 查询?在我看来,转换并不成功(回复:AS.DATE(date_field, '%Y%m' as "format") as yyyymm)。我真的希望这个问题可以通过 dplyr 语法解决?

我查看了作者的文档 https://github.com/ianmcook/implyr 并通过堆栈上的问题,但一直无法弄清楚。

提前致谢。

编辑:
我能够做到这一点:

library(implyr); library(dplyr) data %>% select(date_field) %>% mutate(yyyy = year(date_field), mm = month(date_field))

产生:

Date_Field                 yyyy    mm
2015-04-13 19:33:26.000    2015     4

但是,如果我添加 %>% mutate(yyyymm = paste0(yyyy,mm)),则错误出现在 Impala 查询 errorMessage:AnalysisException: No matching function with signature: concat(INT, INT) 中。所以我需要做的是在连接它们之前将 yyyymm 对象转换为字符串,以便 Impala 识别它。在 Impala 中,它看起来像这样:

select date_field , concat(cast(year(date_field) as string), cast(month(date_field) as string)) as yyyymm from data

并给了我我要找的东西:

Date_Field               yyyymm
2015-04-13 19:33:26      20154

除了月份格式的小例外,它应该可以用 Impala 中的 lpad 之类的东西来修复,但出于我的目的我不关心这个。所以我需要弄清楚的是如何在执行 paste0 函数之前将我的 dplyr R 代码中的 yyyymm 字段适当地转换为字符串。

在 as.Date() 函数中,您应该传递给参数的格式是数据所在的格式,而不是您希望转换的格式。

使用 lubridate 包,我重现了你的问题,这对我有用:

 library(lubridate)

 paste0(year(as.Date(date_field, "%Y-%m-%d")), month(as.Date(date_field, "%Y-%m-%d")))

您只需要在您的 mutate 调用中传递它。

我明白了。自从我上次编辑我的问题以来,修复只需要添加以下内容:

    mutate(yyyy = as.character(yyyy), mm = as.character(mm)) %>%
    mutate(yyyymm = paste0(yyyy,mm))

所以完整的解决方案是:

library(implyr); library(dplyr) 
data %>%
    select(date_field) %>%
    mutate(yyyy = year(date_field), mm = month(date_field)) %>%
    mutate(yyyy = as.character(yyyy), mm = as.character(mm)) %>%
    mutate(yyyymm = paste0(yyyy,mm))

问题是我需要分步执行此操作,以便 Impala 将其识别为可执行查询。