#r #date #apache-spark #sparkr #sparklyr
#r #apache-spark #sparklyr
Вопрос:
У меня есть 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. После преобразования все строки преобразуются в double.
# 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;
Не уверен, что делать.
Ответ №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_*
).
Комментарии:
1. Один
sdf %>% mutate(Date = date_add(to_date("1970-01-01"), Date))
потрясающий. У меня это сработало идеально.