我希望能够在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
的句柄。这可能吗?
如果可能的话,我也愿意接受任何其他方法。我已经调查过试图在sparkR
和sparklyr
之间移动,但似乎后端太不同了(据我所知)。我也相信here至于lapply
还没有类似的sparklyr
。
感谢您的帮助
答案 0 :(得分:1)
长话短说不可能。 Apache Spark不支持并且很可能永远不会支持嵌套的并行操作。这与特定的后端无关。您可以尝试将SparkR::*apply
方法用于本机R客户端(dbConnect
,RCassandra
)。
您可以访问JVM对象:
SparkR::as.DataFrame(dt_local)@sdf
但它根本无法在驱动程序节点之外使用。