使用pyspark或cql查询从cassandra表中删除行

lvmkulzt  于 2021-05-29  发布在  Spark
关注(0)|答案(2)|浏览(352)

我有一个包含很多列的表,例如test\u event,还有一个表test在同一个keyspace中,它包含我必须从test\u event中删除的行的id。
我试过从Cassandra删除,但是没有用,因为spark看不到sparkcontext。我发现了一些使用delete-from的解决方案,但它是用scala编写的。
经过大约一百次的尝试,我终于弄糊涂了,请求你的帮助。有人能和我一步一步地做吗?

lmvvr0a8

lmvvr0a81#

看看这个代码:

from pyspark.sql import SQLContext

def main_function():

  sql = SQLContext(sc)
  tests = sql.read.format("org.apache.spark.sql.cassandra").\
               load(keyspace="your keyspace", table="test").where(...)
  for test in tests:
    delete_sql = "delete from test_event where id = " + test.select('id')
    sql.execute(delete_sql)

请注意,一次删除一行并不是spark的最佳实践,但上面的代码只是一个示例,可以帮助您了解实现。

xmjla07d

xmjla07d2#

spark cassandra连接器(scc)本身只为python提供Dataframeapi。但是有一个pyspark cassandra包在scc之上提供rddapi,所以可以按如下方式执行删除。
从pyspark shell开始(我尝试过spark 2.4.3):

bin/pyspark --conf spark.cassandra.connection.host=IPs\
    --packages anguenot:pyspark-cassandra:2.4.0

和内部从一个表中读取数据,并执行删除操作。您需要有源数据才能有与主键对应的列。它可以是完全主键,部分主键,或者只有分区键-根据它的不同,cassandra将使用相应的tombstone类型(row/range/partition tombstone)。
在我的示例中,表的主键由一列组成-这就是为什么我在数组中只指定了一个元素:

rdd = sc.cassandraTable("test", "m1")
rdd.deleteFromCassandra("test","m1", keyColumns = ["id"])

相关问题