如何在 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)
中。所以我需要做的是在连接它们之前将 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
之类的东西来修复,但出于我的目的我不关心这个。所以我需要弄清楚的是如何在执行 paste0
函数之前将我的 dplyr
R 代码中的 yyyy
和 mm
字段适当地转换为字符串。
在 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 将其识别为可执行查询。
我正在使用 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)
中。所以我需要做的是在连接它们之前将 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
之类的东西来修复,但出于我的目的我不关心这个。所以我需要弄清楚的是如何在执行 paste0
函数之前将我的 dplyr
R 代码中的 yyyy
和 mm
字段适当地转换为字符串。
在 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 将其识别为可执行查询。