#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:
- Пожалуйста, ознакомьтесь с проектом Apache Arrow, в нем есть поддержка преобразования собственных типов в типы spark.
- Создайте вектор ваших текущих типов данных и сопоставьте его с 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)
}