我使用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)
中。所以我需要做的是将yyyy
和mm
对象转换为字符串,然后连接它们以便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代码中的dplyr
和paste0
字段适当地转换为字符串。
答案 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将其识别为可执行查询。