Функция для преобразования типов R в типы Spark

#r #apache-spark #dplyr #sparklyr #livy

#r #apache-spark #dplyr #sparklyr #ливи #livy

Вопрос:

У меня есть фрейм данных R, который я хотел бы преобразовать в фрейм данных Spark на удаленном кластере. Я решил записать свой фрейм данных в промежуточный CSV-файл, который затем считывается с помощью sparklyr::spark_read_csv() . Я делаю это, поскольку фрейм данных слишком велик для отправки напрямую с помощью sparklyr::sdf_copy_to() (что, я думаю, связано с ограничением в Livy).

Я хотел бы программно перенести типы столбцов R, используемые во фрейме данных, в новый фрейм данных spark, написав функцию, которая возвращает именованный вектор, который я могу использовать с columns аргументом в spark_read_csv() .

Ответ №1:

  1. Пожалуйста, ознакомьтесь с проектом Apache Arrow, в нем есть поддержка преобразования собственных типов в типы spark.
  2. Создайте вектор ваших текущих типов данных и сопоставьте его с spark с помощью cast.

Это единственные два способа, которые я могу придумать прямо сейчас.

Комментарии:

1. Это выглядит потенциально полезным, спасибо. Работает ли Arrow с удаленными подключениями?

Ответ №2:

У меня есть только элементарные знания о сопоставлении типов данных R (в частности, возвращаемых class() функцией) с типами данных Spark. Однако следующая функция, похоже, работает так, как я ожидал. Надеюсь, другие найдут это полезным / улучшат его:

 get_spark_data_types_from_data_frame_types <- function(df) {



    r_types <-
        c("logical", "numeric", "integer", "character", "list", "factor")

    spark_types <-
        c("boolean", "double", "integer", "string", "array", "string")

    types_in <- sapply(df, class)    


    types_out <- spark_types[match(types_in, r_types)]

    types_out[is.na(types_out)] <- "string" # initialise to character by default

    names(types_out) <- names(df)

    return(types_out)

}