Преобразовать Double в дату с помощью Spark в R

#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)) потрясающий. У меня это сработало идеально.