通过scala连接cassandra群集

通过scala连接cassandra群集,scala,playframework,cassandra,Scala,Playframework,Cassandra,我对斯卡拉和卡桑德拉都是新手。我知道cassandra使用hector与java的连接性。但我不知道如何通过scala连接cassandra。我想要一个简单的例子。有一些Scala项目支持Cassandra连接,包括Twitter,但它们似乎都消失了 由于您了解Hector,如果您的类路径中有Hector JAR,您可以在Scala中使用Hector API(如果您愿意) 例如,从中借用,您可以这样做: val myCluster = HFactory.getOrCreateCluster("t

我对斯卡拉和卡桑德拉都是新手。我知道cassandra使用hector与java的连接性。但我不知道如何通过scala连接cassandra。我想要一个简单的例子。

有一些Scala项目支持Cassandra连接,包括Twitter,但它们似乎都消失了

由于您了解Hector,如果您的类路径中有Hector JAR,您可以在Scala中使用Hector API(如果您愿意)

例如,从中借用,您可以这样做:

val myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160")


我徒手写了这篇文章,所以语法可能不正确,但你明白了。

我使用的是datastax java驱动程序。它的开发在github上仍然很活跃。我早些时候看了看赫克托,但它似乎快死了。这里的文档很有用:。我将第一个示例翻译成scala。另外,看看typesafe activator中的akka cassandra示例。干杯

object Hello extends App {

  import com.datastax.driver.core.Cluster;
  import com.datastax.driver.core.Host;
  import com.datastax.driver.core.Metadata;
  import scala.collection.JavaConversions._

  var cluster: Cluster = null
  private var session: Session = null

  def connect(node: String) {
    cluster = Cluster.builder().addContactPoint(node).build()
    val metadata = cluster.getMetadata()
    printf("Connected to cluster: %s\n",
      metadata.getClusterName())
    metadata.getAllHosts() map {
      case host =>
        printf("Datatacenter: %s; Host: %s; Rack: %s\n",
          host.getDatacenter(), host.getAddress(), host.getRack())
    }
  }

  def close() {
    cluster.shutdown()
  }

  this.connect("127.0.0.1");
  this.close();
}

我一直在研究Java驱动程序的Scala包装器,以最小化样板代码。你可以在这里找到它:

下面是一个使用Cassandra DB的类示例:

class Db(session: com.datastax.driver.core.Session) {

  implicit val cache = new SessionQueryCache[PlainConverter](session)

  // class for binding input/output parameters
  case class User(userId: Int, name: String)

  def insertUser(user: User): Future[Unit] = cql"insert into users(userid, name) values (?, ?)".bind(user).execute

  // returns Future[Iterator[User]]
  def selectAllUsers: Future[Iterator[User]] = cql"select * from users".all[User]

  // if no user is found will throw NoRowsSelectedException
  def selectUser(userId: Int) = cql"select * from users where userId = $userId".one[User]

  // if no user is found will return None, otherwise Some(User)
  def selectUserIfFound(userId: Int) = cql"select * from users where userId = $userId".oneOption[User]
}
要在playframework项目中使用库,请将此行添加到build.sbt文件:

libraryDependencies += "eu.inn" %% "binders-cassandra" % "0.2.0"
Datastax驱动程序3 Scala集成 我找到了一些文章 及 展示了如何更好地将Java驱动程序与Scala集成,看起来并不难

结果是您可以在GitHub上找到我自己的库:

它允许在Scala中无缝集成
CQL
查询和操作
ListenableFuture
,而无需将其映射到
Scala.Future

implicit protected val session: com.datastax.driver.core.Session
implicit protected val executor: java.util.concurrent.Executor

val selectCQL: ListenableFuture[PreparedStatement] = cql"SELECT * FROM $table WHERE key = ?"
val result: ListenableFuture[ResultSet] = execute(selectCQL, "my-key")

result.map(rs => rs.one())
      .map(...)

享受:)

这是个糟糕的建议。您应该使用@kfer38建议的本地Java驱动程序。告诉某人在冰淇淋圣代中添加tabasco酱是“错误的建议”。您忽略了更广泛的一点,那就是您可以使用Scala语法合并任何Java API(而不是使用Scala构建的API),因为OP的经验,我举了Hector为例。感谢@kfer38为我的观点提供了另一个例子。作为卡桑德拉的客户,Datastax驱动程序如何与赫克托进行比较超出了问题的范围。也许“坏建议”太强烈了。在为你辩护时,他确实问了赫克托的具体情况。然而,很明显(从他第一次使用Scala访问Cassandra的事实来看),他正在编写新代码,在这种情况下,使用一个实际上已经弃用的库是不明智的。本机Java库应该被认为是目前唯一有效的基于JVM的选项。在我今天写这篇文章时,对Hector的最后更改是在17天前对test目录和一个月前对src目录进行的:。对我来说,这听起来很不“不赞成”。不管怎样,你关于赫克托尔货币的观点是离题的。我会让OP来判断哪一个图书馆最适合他的需要。我只能想象当一个人问你“想去新的寿司店吃晚餐吗?”你的回答会转化为白米和糙米的营养价值。我在玩!2.4框架和Cassandra 2.2版本。我也无法通过我的代码连接Cassandra。我在应用程序中使用Kundera 3.2库依赖项通过Kundera进行连接。但我仍然无法从我的应用程序连接cassandra db。如果有人能帮助正确配置昆德拉游戏!框架,并在build.sbt文件或persistence.xml文件中进行必要的更改?我得到的错误是
com.motorgence.kundera.kundera异常:所有主机都已关闭。请手动检查服务器。
请帮助!!!你能告诉我必须放在sbt文件中的库依赖项吗?
libraryDependencies+=“com.datasax.cassandra”%”cassandra驱动程序核心“%”1.0.4“
我得到一个错误——“找不到抽象类型类‘org.apache.cassandra.db.marshal.TimestampType']”@我使用的是github页面上发布的最新驱动程序
“com.datasax.cassandra”%“cassandra驱动核心”%“2.0.0-beta2”
。它编译起来没有问题。需要删除此行“private var session:session=null”,否则必须导入会话。这是转录驱动程序示例的第2部分留下的。耶!我的问题解决了。。现在我正在使用datastax驱动程序,但是它检索记录的速度非常慢,大约是使用hector的10倍。。。
implicit protected val session: com.datastax.driver.core.Session
implicit protected val executor: java.util.concurrent.Executor

val selectCQL: ListenableFuture[PreparedStatement] = cql"SELECT * FROM $table WHERE key = ?"
val result: ListenableFuture[ResultSet] = execute(selectCQL, "my-key")

result.map(rs => rs.one())
      .map(...)