【问题标题】:Error after trying to make a date column from a character column尝试从字符列创建日期列后出错
【发布时间】:2018-02-01 17:59:54
【问题描述】:

使用库sparklyr,我尝试以这种方式在 Spark 数据框中创建一个日期变量(在 R 中有效):

# Researching SPARK --------------------------------------------------------------------------

#library(data.table)
library(sparklyr)
library(dplyr)

setwd('C:/Users/aburnakov/Desktop')

#spark_install(version = "2.1.0")

r_spark_connection <- spark_connect(master = "local")

sample_dat <- data.frame(When = as.character(
     c(
     "2018-01-15 03:05:02.177"
     , "2018-01-15 00:54:31.133"
     , "2018-01-15 21:24:06.013"
     , "2018-01-15 15:44:26.047" 
     , "2018-01-15 05:17:06.040"
     , "2018-01-15 06:41:08.183"
     , "2018-01-15 15:09:40.137"
     , "2018-01-15 03:15:43.820"
     , "2018-01-15 11:02:27.180"
     , "2018-01-15 18:23:42.047"
          )
     )
)

write.csv(x = sample_dat, file = 'sample_dat.csv')

## write raw data from csv to spark env ------------------------------------------

sample_spark_df <- spark_read_csv(
     sc = r_spark_connection
     , name = 'sample_dat'
     , path = 'sample_dat.csv'
     , header = T
     , infer_schema = F
     , delimiter = ","
     , quote = '"'
     , escape = '`'
     , charset = "UTF-8"
     , null_value = NULL
     , repartition = 10
     , memory = F
     , overwrite = T
)


## try either of two

sample_spark_df <- sample_spark_df %>%
     mutate(
          Date = as.Date(When, format = "%Y-%m-%d", tz = "")
     )

sample_spark_df <- sample_spark_df %>%
     mutate(
          datetime_when = as.POSIXct(strptime(x = When, format = "%Y-%m-%d %H:%M:%OS", tz = ""))
     )


## now observe the error

x <- collect(sample_spark_df)

这是为什么?我还能用指示格式和时区制作日期吗?

类似问题:Converting string/chr to date using sparklyr

【问题讨论】:

  • 我无法重现您的错误。你能包括一个 sample_spark_df 的样本吗?
  • @Rilcon42,我忘了提到奇怪的是,直到我尝试将对象从 spark 收集()到 R 以检查结果时才报告此错误。收集()失败。我会更新我的问题。
  • @Rilcon42,我实际上有问题 datetime_when = as.POSIXct(strptime(x = When, format = "%Y-%m-%d %H:%M:%OS ", tz = "")) 也得到另一个错误。

标签: r date dplyr sparklyr


【解决方案1】:

我无法直接从 sparklyr 读取您的日期,但如果您想将它们读取为 POSIXct,您可以使用 DBI 包:

res <- DBI::dbGetQuery(r_spark_connection, "Select _c0, When, 
unix_timestamp(When, \"yyyy-MM-dd HH:mm:ss.SSS\") as dateTS FROM sample_dat")

res %>% mutate(dateRestored = as.POSIXct(dateTS, origin = "1970-01-01"))
   _c0                    When     dateTS        dateRestored
1   10 2018-01-15 18:23:42.047 1516037022 2018-01-15 18:23:42
2    1 2018-01-15 03:05:02.177 1515981902 2018-01-15 03:05:02
3    2 2018-01-15 00:54:31.133 1515974071 2018-01-15 00:54:31
4    3 2018-01-15 21:24:06.013 1516047846 2018-01-15 21:24:06
5    4 2018-01-15 15:44:26.047 1516027466 2018-01-15 15:44:26
6    5 2018-01-15 05:17:06.040 1515989826 2018-01-15 05:17:06
7    6 2018-01-15 06:41:08.183 1515994868 2018-01-15 06:41:08
8    7 2018-01-15 15:09:40.137 1516025380 2018-01-15 15:09:40
9    8 2018-01-15 03:15:43.820 1515982543 2018-01-15 03:15:43
10   9 2018-01-15 11:02:27.180 1516010547 2018-01-15 11:02:27

这个想法是使用这个包使用 Spark SQL 读取数据,并使用函数unix_timestamp 从字符日期创建时间戳。然后,您可以将as.POSIXct 函数用于时间戳。

我希望这会有所帮助。

【讨论】:

  • 谢谢!我会考虑这个选项。我已经找到了在 spark df 格式中使用 SQl 调用的解决方案,并设法将字符串 - 痛苦地 - 转换为日期。刚刚意识到很多在普通 R 中工作的东西都不受支持,就像在 sparklyr 中一样。
  • 不客气 :-) 处理日期通常很痛苦……我使用 DBI 包来执行这类操作,使用 Spark SQL 可能更容易(或支持)。您还可以使用dbSendQuery() 函数来“编程”查询的执行,而无需将结果输入 R。例如,我使用此函数来创建中间表。
  • 嘿@JaimeCaffarel 我可以在mutate 中使用dbSendQuery 作为SPARK 数据帧吗?我还不想收集我的结果,但我需要创建这些时间变量。
  • @ℕʘʘḆḽḘ 我不太确定。 dbSendQuery 返回 DBIResultmutate 接收 tbl。因此,它们之间需要一种“整合”。另一方面,我不认为你可以直接在 Spark 中使用 sparklyr 执行 as.POSIXct 函数,但我可能错了......
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2020-12-14
  • 1970-01-01
  • 2017-12-04
  • 2015-10-07
  • 2023-01-04
相关资源
最近更新 更多