2017-08-03 45 views
2

我有一个列数为characters的Spark数据框,其格式为20/01/2000(日/月/年)。Sparklyr - 在火花中更改日期格式

但我试图将其更改为日期格式,所以我可以在这里使用函数: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)) 

我得到:

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

由于R的功能as.Date()没有按”工作,我不得不使用另一种工具。

任何线索?

回答

2

正如已经想通了,这种失败,因为19/11/2010是不被接受的日期格式。在星火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不支持列类型日期。