【问题标题】:POSIXct type demoting on Apache Spark 2.1.0 with SparkR dapply使用 SparkR dapply 在 Apache Spark 2.1.0 上降级 POSIXct 类型
【发布时间】:2017-10-10 16:15:39
【问题描述】:

我对 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

谢谢!

【问题讨论】:

    标签: apache-spark sparkr


    【解决方案1】:

    根据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"
    

    我希望这会有所帮助。

    【讨论】:

    • 感谢您的回复!我已经考虑过像你这样的方法,问题是我不想每次需要使用它时都将时间戳转换为 POSIXct。我现在正在考虑直接使用以秒为单位的纪元时间戳,这样我就可以完成大部分操作,但是如果数据设置为给定的模式,为什么 SparkR 会降级呢?
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2018-01-22
    • 2021-03-12
    • 2017-09-24
    相关资源
    最近更新 更多