Scala Spark:如何从Cassandra中读取表块
我有一张垂直生长的大桌子。我希望以小批量读取行,以便可以处理每个行并保存结果 表定义Scala Spark:如何从Cassandra中读取表块,scala,cassandra,apache-spark,Scala,Cassandra,Apache Spark,我有一张垂直生长的大桌子。我希望以小批量读取行,以便可以处理每个行并保存结果 表定义 CREATE TABLE foo ( uid timeuuid, events blob, PRIMARY KEY ((uid)) ) 代码尝试1-使用CassandraSQLContext 最后一行抛出 主线程java.lang.RuntimeException中出现异常:[1.79]失败: ``应为,但找到标识符ea620 从foo.bar中选择事件,其中tokenuid> 令牌131EA620-
CREATE TABLE foo (
uid timeuuid,
events blob,
PRIMARY KEY ((uid))
)
代码尝试1-使用CassandraSQLContext
最后一行抛出
主线程java.lang.RuntimeException中出现异常:[1.79]失败:
``应为,但找到标识符ea620
从foo.bar中选择事件,其中tokenuid>
令牌131EA620-2e4e-11e4-a2fc-8d5aad979e84限制10
^
在scala.sys.package$.errorpackage.scala:27
位于org.apache.spark.sql.catalyst.AbstractSparkSQLParser.applySparkSQLParser.scala:33
位于org.apache.spark.sql.SQLContext$$anonfun$1.applySQLContext.scala:79
位于org.apache.spark.sql.SQLContext$$anonfun$1.applySQLContext.scala:79
但如果我在cqlsh中运行cql,它将返回正确的10条记录
代码尝试2-使用DataStax Cassandra连接器
这个扔
org.apache.spark.sparkeexception:由于阶段失败,作业中止:
阶段1.0中的任务0失败1次,最近一次失败:丢失任务0.0
在阶段1.0 TID 1中,localhost:java.io.IOException:Exception
准备SELECT uid,来自foo.bar的事件,其中
令牌UID>?和tokenuid$lastUUID ALLOW
筛选:第1行:118在字符“$”处没有可行的备选方案
如何使用where令牌。。。spark和Cassandra中的查询?我将使用DataStax Cassandra Java驱动程序。与CassandraSQLContext类似,您可以选择如下块:
val query = QueryBuilder.select("events")
.where(gt(token("uid"),token(lastUUID))
.limit(10)
val rows = session.execute(query).all()
如果要异步查询,会话还具有executeAsync,它返回RichListenableFuture,可通过添加回调由scala Future包装。不确定到底是什么导致了错误,但spark查询应使用SQL语法而不是CQL,因为您使用的是CassandraSQLContext,可能需要在QuoTeStok中包装UUID必须不是SQL函数,考虑切换到标准DATASAX连接器,而不是SQL CONTERCTCQL查询非常有限,我只使用它来加载必要的数据,然后只使用相同的查询作为正常的RDDDO,但去掉Soad的部分并在SCAPK中执行范围,您可以执行的查询类型取决于您的聚类列在cassandra中的排列方式,
// Step 1. Get uuid of the last row in a batch
val max = 10
val rdd = sc.cassandraTable("foo", "bar")
var cassandraRows = rdd.take(max)
var lastUUID = cassandraRows.last.getUUID("uid");
// lastUUID = 131ea620-2e4e-11e4-a2fc-8d5aad979e84
// Step 2. Execute query
rdd.where(s"token(uid) > token($lastUUID)").take(max)
val query = QueryBuilder.select("events")
.where(gt(token("uid"),token(lastUUID))
.limit(10)
val rows = session.execute(query).all()