【问题标题】:Spark joinWithCassandraTable() on map multiple partition key ERRORSpark joinWithCassandraTable() 映射多个分区键错误
【发布时间】:2015-10-24 17:52:21
【问题描述】:

我正在尝试使用以下方法过滤一个巨大的 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: 方法应用的参数不足: (imei: String, created: Long)test.TableKey in object TableKey. [错误] 创建了未指定的值参数。 [错误] val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey(_2)).joinWithCassandraTable("listener","snapshots_test_b") [错误] ^ [错误] 发现一个错误 [错误] (compile:compile) 编译失败

它只适用于分区键中的一个对象,如Documentation

为什么多个分区键会出现问题?- 已回答。

编辑:我尝试以正确的形式使用 joinWithCassandraTable:

val snapshotsFiltered = sc.parallelize(startDate to endDate).map(TableKey("*",_,startDate)).joinWithCassandraTable("listener","snapshots_test_c")

当我尝试在 Spark 上运行它时没有错误,但它永远停留在“[stage 0:> (0+2)/2]”...

出了什么问题?

【问题讨论】:

    标签: scala cassandra apache-spark datastax-enterprise


    【解决方案1】:

    错误告诉您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")
    

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多