【发布时间】:2013-10-24 03:16:19
【问题描述】:
我是 scala 和 cassandra 的新手。我知道 cassandra 与 java 使用 hector 的连接性。但我不知道如何通过scala连接cassandra。我想要一个简单的例子。
【问题讨论】:
标签: scala playframework cassandra
我是 scala 和 cassandra 的新手。我知道 cassandra 与 java 使用 hector 的连接性。但我不知道如何通过scala连接cassandra。我想要一个简单的例子。
【问题讨论】:
标签: scala playframework cassandra
我正在使用 datastax java 驱动程序。它的开发仍在 github 上进行。我早些时候看着赫克托,但它似乎死了。这里的文档很有帮助:http://www.datastax.com/documentation/developer/java-driver/1.0/webhelp/index.html#java-driver/quick_start/qsQuickstart_c.html。我将第一个示例翻译成 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();
}
【讨论】:
libraryDependencies += "com.datastax.cassandra" % "cassandra-driver-core" % "1.0.4"
"com.datastax.cassandra" % "cassandra-driver-core" % "2.0.0-beta2" 上的最新驱动程序。它编译没有问题。这一行 `private var session: Session = null` 需要删除,否则你必须导入 Session。它是在转录驱动程序示例的第 2 部分时留下的。
我一直致力于 Java 驱动程序的 Scala 包装器,以尽量减少样板代码。你可以在这里找到它: https://github.com/InnovaCo/binders-cassandra
这是一个与某些 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"
【讨论】:
出现了一些支持 Cassandra 连接的 Scala 项目,包括 Twitter 的 cassie,但它们似乎都已消亡。
由于您了解 Hector,如果您的类路径中有 Hector jar,您可以根据需要在 Scala 中简单地使用 Hector API。
例如,借用documentation,你可以这样做:
val myCluster = HFactory.getOrCreateCluster("test-cluster","localhost:9160")
或
val template = new ThriftColumnFamilyTemplate[String, String](ksp, columnFamily, StringSerializer.get(), StringSerializer.get())
我是徒手写的,所以语法可能不对,但你明白了。
【讨论】:
com.impetus.kundera.KunderaException: All hosts are down. please check servers manully. 请帮忙!!!
我找到了一些文章(example) 和Maga library 展示了如何将 Java Driver 与 Scala 更好地集成,看起来并不难。
结果是我自己的库,你可以在 GitHub 上找到:https://github.com/atais/scassandra
它允许在 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(...)
享受:)
【讨论】: