Sparklyr - 改变Spark中的日期格式

时间:2017-08-03 18:44:11

标签: r date apache-spark sparklyr

我有一个Spark数据框,其列characters为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))

我明白了:

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

由于R的函数as.Date()不起作用,我必须使用其他工具。

任何线索?

3 个答案:

答案 0 :(得分:2)

sparklyr还不支持列类型日期。

答案 1 :(得分:2)

正如已经想到的那样,这会失败,因为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 :(得分:1)

您可以使用Hive(Spark SQL所基于的)定义的函数来完成此任务,请参阅:https://spark.rstudio.com/articles/guides-dplyr.html#hive-functions