我有一个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()
不起作用,我必须使用其他工具。
任何线索?
答案 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