Sparklyr - 在Spark中更改日期格式

3
我有一个Spark数据框,其中一列是字符,格式为20/01/2000(日/月/年)。

但我想将其更改为日期格式,以便能够使用此处的函数:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions 仅获取所需的数据(例如提取月份和日期)。

但似乎这些函数仅适用于使用其他日期格式,如1970-01-30。

例如:

sc <- spark_connect(master = "spark://XXXX")
df <- data.frame(date = c("20/10/2010", "19/11/2010"))
df_tbl <- copy_to(sc, df, "df")

如果我想在一个新的列中提取只有月份的信息:
df_tbl <- df_tbl %>% mutate(month = month(date))

I get:

> df_tbl %>% glimpse()
Observations: 2
Variables: 2
$ data  <chr> "20/10/2010", "19/11/2010"
$ month <int> NA, NA

由于 R 语言中的 as.Date() 函数无法使用,我需要使用另外的工具。

有任何线索吗?

3个回答

4

正如已经发现的那样,这个失败是因为19/11/2010不是一个被接受的日期格式。在Spark 2.2或更高版本中,您可以:

df_tbl %>% mutate(month = month(to_date(date, "dd/MM/yyyy")))

# # Source:   lazy query [?? x 2]
# # Database: spark_connection
#   date       month
#    <chr>      <int>
# 1 20/10/2010    10
# 2 19/11/2010    11

在2.1或更早版本中:
df_tbl %>% 
  mutate(month = month(from_unixtime(unix_timestamp(date, "dd/MM/yyyy"))))

# # Source:   lazy query [?? x 2]
# # Database: spark_connection
#   date       month
#   <chr>      <int>
# 1 20/10/2010    10
# 2 19/11/2010    11

除了格式之外:

df_tbl %>%  
   mutate(formatted = from_unixtime(
     unix_timestamp(date, "dd/MM/yyyy"), "dd-MM-yyy"))

# # Source:   lazy query [?? x 2]
# # Database: spark_connection
#   date       formatted 
#   <chr>      <chr>     
# 1 20/10/2010 20-10-2010
# 2 19/11/2010 19-11-2010

2

目前,sparklyr 不支持日期类型的列。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接