value slice不是play.api.libs.iteratee.Enumerator的成员

Rah*_*hai 5 scala cassandra-2.0 phantom-dsl

我正在编写基于"大型记录集的异步迭代器"的代码,在https://github.com/websudos/phantom#partial-select-queries中描述

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
import org.joda.time.format.DateTimeFormatter

import com.anomaly42.aml.dao.CassandraConnector
import com.websudos.phantom.CassandraTable
import com.websudos.phantom.Implicits._

object People extends People {
  def getPersonByUpdatedAt(from:String, to:String, start: Int, limit: Int) = {
    val dtf:DateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
    val fromDateTime = dtf.parseDateTime(from)
    val toDateTime = dtf.parseDateTime(to)

    People.select(_.updated_at, _.firstName).allowFiltering.where(_.updated_at gte fromDateTime).and(_.updated_at lte toDateTime).fetchEnumerator().slice(start, limit).collect
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下库依赖:

scalaVersion  := "2.11.6"
libraryDependencies ++= Seq(
  "com.websudos"        %%  "phantom-dsl"     % "1.5.4",
  many more...
)
Run Code Online (Sandbox Code Playgroud)

但是我在编译时遇到以下错误:

value slice is not a member of play.api.libs.iteratee.Enumerator[(org.joda.time.DateTime, Option[String])]
Run Code Online (Sandbox Code Playgroud)

我想要做的是编写一个查询,每次调用getPersonByUpdatedAt()方法时,从'start'开始返回下一个'limit'结果数.

fla*_*ian 3

这里有很多实现细节需要解决。首先,如果您需要分页,可能有一种更简单的方法可以通过简单的范围查询而不是过滤数据来实现这一目标。

看看 using CLUSTERING ORDER,那个调用ALLOW FILTERING不应该在那里。此外,如果没有CLUSTERING ORDER默认的 Murmur3 分区程序,实际上并没有排序,因此您无法保证按照写入的顺序检索数据。

这可能意味着您的分页根本不起作用。最后但并非最不重要的一点是,直接使用枚举器可能不是您想要的。

它们是异步的,因此您必须在 future 内部进行映射才能获取切片,但除此之外,当 Spark 之类的东西一次加载整个表(例如许多结果)时,枚举器非常有用。

总而言之,在 people 表中:

object id extends UUIDColumn(this) with PartitionKey[UUID]// doesn't have to be UUID
object start extends DateTimeColumn(this) with ClusteringOrder[DateTime] with Ascending
object end extends DateTimeColumn(this) with ClusteringOrder[DateTime] with Ascending
Run Code Online (Sandbox Code Playgroud)

只需使用Scala 集合库中的fetch()即可。Seq.slice上面假设您想​​按升序分页,例如首先检索最旧的。

您还需要弄清楚实际的分区键是什么。如果 2 个用户同时更新,最坏的情况是丢失数据并以 FIFO 队列结束,例如给定时间的最后一次更新“获胜”。我id在上面使用过,但这显然不是你需要的。

您可能需要有多个表来存储人员,以便可以满足您需要的所有查询。