使用SparkR dapply在Apache Spark 2.1.0上进行POSIXct类型降级

时间:2017-05-11 15:03:00

标签: apache-spark sparkr

我遇到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

谢谢!

1 个答案:

答案 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"

我希望这会有所帮助。