2017-01-22 2 views
0

Я хотел бы иметь возможность использовать методы Java в SparkR SparkDataFrame для записи данных в Cassandra.Serialize SparkR DataFrame to jobj

Используя sparklyr расширения, например, я могу сделать что-то вроде этого:

sparklyr::invoke(sparklyr::spark_dataframe(spark_tbl), "write") %>>% 
sparklyr::invoke("format", "org.apache.spark.sql.cassandra") %>>% 
sparklyr::invoke("option", "keyspace", keyspace) %>>% 
sparklyr::invoke("option", "table", table) %>>% 
sparklyr::invoke("mode", "append") %>% 
sparklyr::invoke("save") 

, который может достигать скорости записи около 20k строк в секунду.

Для моего варианта использования, я бы хотел использовать SparkR::spark.lapply, чтобы я мог собирать подмножества своей таблицы Cassandra локально, запускать на них сценарий и записывать данные обратно. Каждый метод, который я пробовал с помощью sparklyr, оказался однопоточным, и поэтому совсем не использовал искру.

С SparkR, я могу записать данные, используя что-то вроде:

SparkR::saveDF(SparkR::as.DataFrame(dt_local), "", 
       source = "org.apache.spark.sql.cassandra", 
       table = table, 
       keyspace = keyspace, 
       mode = "append") 

однако скорость записи ближе к 2к строк в секунду в этом случае. Я думаю, что смогу использовать SparkR::sparkR.callJMethod для вызова той же цепочки, что и в случае с sparklyr, для достижения более высокой скорости записи, однако мне сначала нужно сериализовать SparkDataFrame, которые имеют ручку для jobj, которой я не был способен сделать. Это возможно?

Я также открыт для любых других способов достижения этого, если это возможно. Я исследовал попытку перемещения между sparkR и sparklyr, но кажется, что бэкэнды слишком разные (насколько я знаю). Я также считаю, что от here нет аналогичных lapply для sparklyr.

Спасибо за любую помощь.

ответ

1

Короткий рассказ невозможен. Apache Spark не поддерживает и, скорее всего, никогда не будет поддерживать вложенные параллельные операции. Это не связано с конкретным бэкэнд. Вы можете попытаться использовать методы SparkR::*apply с родными клиентами R (dbConnect, RCassandra).

Вы можете получить доступ к объекту JVM:

SparkR::as.DataFrame(dt_local)@sdf 

, но он просто не может быть использован вне узла драйвера.