我能够使用-
使用RDD API删除特定的列sc.cassandraTable("books_ks", "books")
.deleteFromCassandra("books_ks", "books",SomeColumns("book_price"))
我正在努力使用Dataframe API来做到这一点。
有人可以分享一个例子吗?
答案 0 :(得分:0)
您无法通过DF API进行删除,而通过RDD API删除是不自然的。 RDD和DF是不可变的,这意味着无需修改。您可以过滤它们以减少它们,但这会生成新的RDD / DF。
话虽如此,您可以做的是过滤出要删除的行,然后构建一个C *客户端来执行该删除操作:
//导入用于Spark和C *连接 导入org.apache.spark.sql.cassandra._ 导入com.datastax.spark.connector.cql.CassandraConnectorConf
spark.setCassandraConf("Test Cluster", CassandraConnectorConf.ConnectionHostParam.option("localhost"))
val df = spark.read.format("org.apache.spark.sql.cassandra").options(Map("keyspace" -> "books_ks", "table" -> "books")).load()
val dfToDelete = df.filter($"price" < 3).select($"price");
dfToDelete.show();
// import for C* client
import com.datastax.driver.core._
// build a C* client (part of the dependency of the scala driver)
val clusterBuilder = Cluster.builder().addContactPoints("127.0.0.1");
val cluster = clusterBuilder.build();
val session = cluster.connect();
// loop over everything that you filtered in the DF and delete specified row.
for(price <- dfToDelete.collect())
session.execute("DELETE FROM books_ks.books WHERE price=" + price.get(0).toString);
少量警告如果您要删除大部分行,此方法将无法正常工作。在此处使用collect意味着将在Spark的驱动程序(又称为SPOF和瓶颈)中完成此工作。
更好的方法是:a)定义DF UDF进行删除,好处是可以并行化。如上所示,将选项b)设置为RDD级别,然后将其删除。
故事的道德,只是因为它可以做到,并不意味着就应该做到。