【问题标题】:Converting string/chr to date using sparklyr使用 sparklyr 将字符串/字符转换为日期
【发布时间】:2018-03-09 06:46:42
【问题描述】:

我在 Hue 中引入了一张表格,其中有一列日期,我正在尝试使用 Rstudio 中的 sparklyr 来玩它。

我想将字符列转换为日期列,如下所示:

Weather_data = mutate(Weather_data, date2 = as.Date(date, "%m/%d/%Y"))

这运行正常,但是当我检查时:

head(Weather_data) 

如何正确地将 chr 转换为日期?

谢谢!!!!

【问题讨论】:

  • 您能否提供dput(Weather_data) 格式的数据您应用转换之前?
  • 感谢您的回答。对不起,我不是最好的 R 或使用色调,所以我不太确定你的意思。但是当我将数据带入色调时,我尝试将列类型选择为日期,但是当它显示输出时,它都是 NA,所以我改用字符串
  • sdf_mutate(Weather_data, date2 = as.Date(date, "%m/%d/%Y"))
  • 感谢您的留言。这给了我错误:
  • as.Date.default(list(src = list(con = list(master = "yarn-client", : c("do not know how to convert 'structure(list(src = structure(list(con = structure(list(master = \"yarn-client\", ' to class "Date"", "不知道如何转换' method = \"shell\", app_name = \"sparklyr \",配置.......

标签: r apache-spark hive dplyr sparklyr


【解决方案1】:

问题是sparklyr 不能正确支持 Spark DateType。可以解析日期和正确的格式,但不能将它们表示为正确的DateType 列。如果够了,请按照以下说明进行操作。

在 Spark 2.2 或更高版本中,使用 to_date 和 Java SimpleDataFormat 兼容字符串:

df <- copy_to(sc, data.frame(date=c("01/01/2010")))
parsed <- df %>% mutate(date_parsed = to_date(date, "MM/dd/yyyy"))
parsed
# Source:   lazy query [?? x 2]
# Database: spark_connection
        date date_parsed
       <chr>       <chr>
1 01/15/2010  2010-01-15

有趣的是内部 Spark 对象仍然使用DateType 列:

parsed %>% spark_dataframe
<jobj[120]>
  class org.apache.spark.sql.Dataset
  [date: string, date_parsed: date]

对于早期版本 unix_timestampcast(但请注意可能的时区问题):

df %>%
  mutate(date_parsed = sql(
    "CAST(CAST(unix_timestamp(date, 'MM/dd/yyyy') AS timestamp) AS date)"))
# Source:   lazy query [?? x 2]
# Database: spark_connection
        date date_parsed
       <chr>       <chr>
1 01/15/2010  2010-01-15

编辑

看起来这个问题已经在当前的 master (sparklyr_0.7.0-9105) 上解决了:

# Source:   lazy query [?? x 2]
# Database: spark_connection
        date date_parsed
       <chr>      <date>
1 01/01/2010  2009-12-31

【讨论】:

  • 请注意,JVM 中的默认时区会在这里耍花招! stackoverflow.com/questions/49355077/…
  • @ℕʘʘḆḽḘ 在实践中,应始终为 Spark 会话明确配置时区 - 否则事情会很快变得丑陋(这比链接的结果要严重得多,这实际上是有意和记录的:)。所以你要么需要extraJavaOptions 要么需要相应的 Spark SQL 配置。
  • 太棒了!你知道用 javaextraoptions 设置 UTC 的正确命令是什么吗?
  • 旧方式 --conf "spark.driver.extraJavaOptions=-Duser.timezone=UTC" --conf "spark.executor.extraJavaOptions=-Duser.timezone=UTC" 或者如果您在 Spark 配置中使用 spark-submit 或等效项。新方式(2.2+)--conf spark.sql.session.timeZone=UTC。几个答案 (stackoverflow.com/…) 如果你想给某个用户点赞 :) 可能的问题是事情会变得很奇怪,如果出于某种疯狂的原因不同的节点有不同的设置:)
猜你喜欢
  • 2015-04-27
  • 2018-05-12
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多