插入一个spark RDD,其中包含n个scala类对象到cassandra db

时间:2016-09-30 15:04:48

标签: apache-spark cassandra rdd spark-cassandra-connector objectmapper

假设我有一个scala类的五个对象,我需要用五个对象构建一个spark RDD并将该RDD推入cassandra表 我的cassandra表“person”有三个字段(pId,pName,pAge) 和

val object 1= new myclass(1,"abc",24)
val object2 = new myclass(2,"pqr",23)
val object3 = new myclass(3,"xyz",26)

我如何形成这三个对象的rdd? 是下面的行

val collection=context.parallelize(Seq(object1,object2,object3))

如果可以制作RDD ..如何将该RDD推送到cassandra表以在该表中插入三行“person”

1 个答案:

答案 0 :(得分:0)

最简单的方法是创建一个CaseClass,其中类与表中的Rows匹配

case class PersonRow(pID: int, pName: String, pAge: Int)
context.parallelize(Seq(
  PersonRow(1, "abc", 24),
  PersonRow(2, "pqr", 23),
  PersonRow(3, "xyz", 26)
)).saveToCassandra("ks","person")

有关详细信息,请参阅Spark Cassandra Connector Documentation

修改

Scala代码中不需要

mapToRow,因为它基本上是Scala中缺少implicits的一种解决方法。 SaveToCassandra通常使用隐式RowWriterFactory,Scala可以通过查看RDD类类型为您做到这一点。在Java中,工厂必须手动完成。

scala> class SomeRandomClass (val k:Int, val v:Int) {
     | def fun() = {println("lots of fun")}
     | val somethingElse:Int = 5
     | }
defined class SomeRandomClass

scala> sc.parallelize(1 to 10).map( x => new SomeRandomClass(x,x)).saveToCassandra("test","test")

scala> sc.cassandraTable("test","test")
res4: com.datastax.spark.connector.rdd.CassandraTableScanRDD[com.datastax.spark.connector.CassandraRow] = CassandraTableScanRDD[7] at RDD at CassandraRDD.scala:15

scala> sc.cassandraTable("test","test").collect
res5: Array[com.datastax.spark.connector.CassandraRow] = Array(CassandraRow{k: 5, v: 5}, CassandraRow{k: 10, v: 10}, CassandraRow{k: 1, v: 1}, CassandraRow{k: 8, v: 8}, CassandraRow{k: 2, v: 2}, CassandraRow{k: 4, v: 4}, CassandraRow{k: 7, v: 7}, CassandraRow{k: 6, v: 6}, CassandraRow{k: 9, v: 9}, CassandraRow{k: 3, v: 3})

注意这只能起作用,因为可以在类(k和v)的字段到列" k和v"之间找到映射。在表格中。