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

zzoitvuj  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(335)

我用的是 implyr 用r包从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 正在作为 dplyr 对于 Impala ,我的问题是-有没有人知道是否有代码,将格式的日期相应地转换成一个可识别的 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

除了月份格式之外,它应该可以用 lpad 在 Impala ,但我不关心我的目的。所以我需要弄清楚的是如何适当地转换 yyyy 以及 mm 我的领域 dplyr 在执行 paste0 功能。

w41d8nur

w41d8nur1#

在as.date()函数中,应该传递给参数的格式是数据所在的格式,而不是要转换的格式。
使用lubridate软件包,我重现了您的问题,这对我很有效:

library(lubridate)

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

你只需要把这个传给你的变异呼叫。

3pvhb19x

3pvhb19x2#

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

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

相关问题