0

我希望能够使用 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但后端似乎太不同了(据我所知)。从这里我也相信,到目前为止还没有类似lapply的东西sparklyr

谢谢你的帮助

4

1 回答 1

1

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

您可以访问 JVM 对象:

SparkR::as.DataFrame(dt_local)@sdf

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

于 2017-01-22T14:46:11.140 回答