将SparkR DataFrame序列化为jobj

时间:2017-01-22 13:10:57

标签: r apache-spark cassandra sparkr sparklyr

我希望能够在SparkR SparkDataFrame上使用Java方法将数据写入Cassandra。

例如,使用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的每个方法最终都是单线程的,因此根本就没有利用spark。

使用SparkR,我可以使用以下内容编写数据:

SparkR::saveDF(SparkR::as.DataFrame(dt_local), "",
               source = "org.apache.spark.sql.cassandra",
               table = table,
               keyspace = keyspace,
               mode = "append")
然而,在这种情况下,写入速度接近每秒2k行。我想我可以使用SparkR::sparkR.callJMethod来调用与sparklyr情况相同的链来实现更高的写入速度,但是我首先需要序列化SparkDataFrame这样的有一个我无法做到的jobj的句柄。这可能吗?

如果可能的话,我也愿意接受任何其他方法。我已经调查过试图在sparkRsparklyr之间移动,但似乎后端太不同了(据我所知)。我也相信here至于lapply还没有类似的sparklyr

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

长话短说不可能。 Apache Spark不支持并且很可能永远不会支持嵌套的并行操作。这与特定的后端无关。您可以尝试将SparkR::*apply方法用于本机R客户端(dbConnectRCassandra)。

您可以访问JVM对象:

SparkR::as.DataFrame(dt_local)@sdf

但它根本无法在驱动程序节点之外使用。