我尝试使用以下方法过滤大型Cassandra表的一小部分:
val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey(_2)).joinWithCassandraTable("listener","snapshots_test_b")
我想在cassandra表中映射' created'作为分区键一部分的列。
我的表键(表的分区键)定义为:
case class TableKey(imei: String, created: Long, when: Long)
结果是错误:
[error] /home/ubuntu/scala/test/test.scala:61:没有足够的方法适用于方法:( imei:String,created:Long)test.TableKey in object TableKey。 [error]已创建未指定的值参数。 [error] val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey(_2))。joinWithCassandraTable(" listener"," snapshots_test_b") [错误] ^ [错误]发现一个错误 [error](编译:编译)编译失败
它只与分区键中的一个对象一起使用,如Documentation。
为什么多分区密钥存在问题? - 已回答。
编辑:我尝试以正确的形式使用joinWithCassandraTable:
val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey("*",_,startDate)).joinWithCassandraTable("listener","snapshots_test_c")
当我尝试在Spark上运行它时,没有错误,但它停留在" [阶段0:> (0 + 2)/ 2]"永远...
出了什么问题?
答案 0 :(得分:5)
错误告诉您类TableKey
需要3个组件进行初始化,但只传递了一个参数。这是Scala编译错误,与C *或Spark无关。
val snapshotsFiltered = sc.parallelize(startDate to endDate)
.map(TableKey(_2)) /// Table Key does not have a single element constructor so this will fail
.joinWithCassandraTable("listener","snapshots_test_b")
一般来说,C *使用整个partition key
来确定特定行的位置。因此,如果您知道整个partition key
,则只能有效地提取数据,因此只传递一部分数据没有价值。
joinWithCassandraTable需要完整的partition key
值,因此它可以有效地完成它的工作。如果您只有parition key
的一部分,则需要执行全表扫描并使用Spark进行过滤。
如果您只想基于clustering column
进行过滤,可以通过将where
子句下推到C *来实现,例如
sc.cassandraTable("ks","test").where("clustering_key > someValue")