Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 映射上的Spark joinWithCassandraTable()多分区键错误_Scala_Cassandra_Apache Spark_Datastax Enterprise - Fatal编程技术网

Scala 映射上的Spark joinWithCassandraTable()多分区键错误

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

我尝试使用以下方法过滤巨大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)
结果是一个错误:

[错误]/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")