我有一个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
我正在尝试使用以下命令将其转换回Date,但会引发错误。
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;
不确定该怎么办。
答案 0 :(得分:2)
这看起来像一个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_*
)。