从Spark

时间:2018-09-10 22:52:16

标签: apache-spark cassandra datastax

我能够使用-

使用RDD API删除特定的列
sc.cassandraTable("books_ks", "books")
  .deleteFromCassandra("books_ks", "books",SomeColumns("book_price"))

我正在努力使用Dataframe API来做到这一点。

有人可以分享一个例子吗?

1 个答案:

答案 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级别,然后将其删除。

故事的道德,只是因为它可以做到,并不意味着就应该做到。