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

时间:2018-04-05 19:40:43

标签: r dplyr hdfs impala

我使用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的后端工作,我的问题是这样的 - 有没有人知道是否存在相应格式化日期的代码转换一个可识别的Impala查询?在我看来,转换并不成功(re: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来修复,但我并不关心这个问题。所以我需要弄清楚的是如何在执行yyyy函数之前将mm R代码中的dplyrpaste0字段适当地转换为字符串。

2 个答案:

答案 0 :(得分:1)

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

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

 library(lubridate)

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

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

答案 1 :(得分:0)

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

    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将其识别为可执行查询。