Spark joinWithCassandraTable()在地图上有多个分区键ERROR

时间:2015-08-02 15:34:02

标签: scala cassandra apache-spark datastax-enterprise

我尝试使用以下方法过滤大型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]"永远...

出了什么问题?

1 个答案:

答案 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")