【问题标题】:Convert Double to Date using Spark in R在 R 中使用 Spark 将 Double 转换为 Date
【发布时间】:2019-01-08 06:25:13
【问题描述】:

我有一个如下的 R 数据框

Date @AD.CC_CC @AD.CC_CC.1 @CL.CC_CC @CL.CC_CC.1
2018-02-05      -380        -380     -1580       -1580
2018-02-06        20          20      -280        -280
2018-02-07      -700        -700     -1730       -1730
2018-02-08      -460        -460     -1100       -1100
2018-02-09       260         260     -1780       -1780
2018-02-12       480         480       380         380

我使用 copy_to 函数将数据帧复制到 Spark。转换后,它将所有行转换为双精度。

# Source:   lazy query [?? x 5]
# Database: spark_connection
Date AD_CC_CC AD_CC_CC_1 CL_CC_CC CL_CC_CC_1
<dbl>    <dbl>      <dbl>    <dbl>      <dbl>
17567     -380       -380    -1580      -1580
17568       20         20     -280       -280
17569     -700       -700    -1730      -1730
17570     -460       -460    -1100      -1100
17571      260        260    -1780      -1780
17574      480        480      380        380

我正在尝试使用以下命令将其转换回日期,但会引发错误。

marketdata_spark %>% mutate(Date = as.Date(Date))
Error: org.apache.spark.sql.AnalysisException: cannot resolve 'CAST(marketdata.`Date` AS DATE)' due to data type mismatch: cannot cast double to date; line 1 pos 59;

不知道该怎么办。

【问题讨论】:

    标签: r apache-spark sparklyr


    【解决方案1】:

    这看起来像一个sparklyr 错误。最简单的解决方法是在调用 copy_to 之前将日期转换为字符:

    df <- tibble::tibble(Date=as.Date(c("2018-02-05", "2018-02-06")))
    sdf <- df %>% mutate(Date = as.character(Date)) %>% copy_to(sc, .)
    
    sdf
    
    # Source:   table<sparklyr_11ae23aa677e> [?? x 1]
    # Database: spark_connection
      Date      
      <chr>     
    1 2018-02-05
    2 2018-02-06
    

    稍后再投射:

    sdf %>% mutate(Date = to_date(Date))
    
    # Source:   lazy query [?? x 1]
    # Database: spark_connection
      Date      
      <date>    
    1 2018-02-05
    2 2018-02-06
    

    您也可以尝试使用数值作为自 Unix 纪元开始以来的偏移量:

    sdf <- df  %>% copy_to(sc, .)
    
    sdf
    
    # Source:   table<sparklyr_13ab19ec6f53> [?? x 1]
    # Database: spark_connection
       Date
      <dbl>
    1 17567
    2 17568
    
    sdf %>% mutate(Date = date_add(to_date("1970-01-01"), Date))
    
    # Source:   lazy query [?? x 1]
    # Database: spark_connection
      Date      
     <date>    
    1 2018-02-05
    2 2018-02-06
    

    或者,您可以完全跳过copy_to(无论如何它的应用程序非常有限,并且在生产中很少有用)并使用一种内置输入格式(spark_read_*)。

    【讨论】:

    • sdf %&gt;% mutate(Date = date_add(to_date("1970-01-01"), Date)) 太棒了。这对我来说非常有效。
    猜你喜欢
    • 2021-05-19
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2021-11-05
    • 2023-04-01
    相关资源
    最近更新 更多