Sparklyr - 在 Spark 中更改日期格式

Sparklyr - Changing date format in Spark

我有一个 Spark 数据框,其列 characters 为 20/01/2000 (day/month/year)。

但我正在尝试将其更改为日期格式,因此我可以使用此处的函数: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() 不起作用,我不得不使用其他工具。

有什么线索吗?

sparklyr 尚不支持列类型日期。

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

如前所述,这失败了,因为 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