我遇到SparkR(Apache Spark 2.1.0)应用函数的问题。在SparkDataFrame上应用任何函数时,POSIXct类型中的时间戳会降级为整数,因为POSIXct保存为自Epoch以来的整数毫秒。
有没有办法阻止这种简化?
这是一个最小的例子:
我创建一个R data.frame并加载到Spark:
localDF <- data.frame(time=as.POSIXct(c("2016-01-01 00:51:45","2016-01-01 02:29:51", "2016-01-01 03:58:45", "2016-01-01 05:27:23")))
df <- as.DataFrame(localDF)
str(df)
获得的输出是:
'SparkDataFrame': 1 variables:
$ time: POSIXct 2016-01-01 00:51:45 2016-01-01 02:29:51 2016-01-01 03:58:45 2016-01-01 05:27:23
现在我使用dapply在这个SparkDataFrame上应用R函数:
sillyFunction <- function(x){
return(x)
}
outdf <- dapplyCollect(df, sillyFunction)
str(outdf)
然而,结构发生了变化:
'data.frame': 4 obs. of 1 variable:
$ time: num 1.45e+09 1.45e+09 1.45e+09 1.45e+09
谢谢!
答案 0 :(得分:0)
根据documentation,我知道R中的POSIXct到Spark中的时间戳之间的映射是默认完成的。
但是,您可以使用原始的POSIXct格式阅读它,只需稍加修改一下您的功能。
sillyFunction <- function(x){
return(strftime(as.POSIXct(x$time, origin="1970-01-01"), format="%Y-%m-%d %H:%M:%S"))
}
> outdf <- dapplyCollect(df, sillyFunction)
> str(outdf)
chr [1, 1:4] "2016-01-01 00:51:45" "2016-01-01 02:29:51" "2016-01-01 03:58:45" "2016-01-01 05:27:23"
我希望这会有所帮助。