Scala 映射上的Spark joinWithCassandraTable()多分区键错误
我尝试使用以下方法过滤巨大Cassandra表的一小部分:Scala 映射上的Spark joinWithCassandraTable()多分区键错误,scala,cassandra,apache-spark,datastax-enterprise,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: St
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)
结果是一个错误:
[错误]/home/ubuntu/scala/test/test.scala:61:没有足够的参数用于对象TableKey中的方法apply:(imei:String,created:Long)test.TableKey。
[错误]未指定的值参数已创建。
[错误]val snapshotsFiltered=sc.parallelize(开始日期到结束日期).map(表键(_2)).joinWithCassandraTable(“侦听器”,“快照”\u测试“)
[错误]^
[错误]发现一个错误
[错误](编译:编译)编译失败
它只与分区键中的一个对象一起工作,就像在中一样
为什么多分区密钥有问题?-回答
编辑:我尝试以正确的形式使用joinWithCassandraTable:
val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey("*",_,startDate)).joinWithCassandraTable("listener","snapshots_test_c")
当我尝试在Spark上运行它时,没有错误,但它永远卡在“[stage 0:>(0+2)/2]”上
出了什么问题?错误告诉您类
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*使用整个
分区键
来确定特定行所在的位置。因此,只有知道整个分区键
时,才能有效地提取数据,因此只传递部分分区键没有任何价值
joinWithCassandraTable需要完整的分区键
值,这样才能有效地完成工作。如果您只有部分分区键
,则需要执行全表扫描并使用Spark进行筛选
如果只想基于聚类列进行筛选,可以通过将where
子句下推到C*来实现,例如
sc.cassandraTable("ks","test").where("clustering_key > someValue")