只有父类列使用cassandra-spark连接器创建cassandra

时间:2015-11-02 05:38:26

标签: scala cassandra apache-spark

我有一个基类:

abstract class Student(id: String) extends Serializable

和儿童班:

case class StdAdd(id: String, name: String, class: String) extends Student(id)

坚持代码:

val newStd: Student = new StdAdd("S001", "Xyz", 4)
sc.parallelize(Seq(newStd)).saveAsCassandraTable("demo", "newStd")

但是当我在Cassandra中检查表中只存储了一列

cqlsh:diwo> SELECT * FROM details;

+------+
|  id  |
+------+
| S001 |
+------+

使用以下sbt依赖项:

libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "1.4.0"
libraryDependencies += "org.apache.spark" % "spark-sql_2.11" % "1.4.0"
libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "1.4.0"

1 个答案:

答案 0 :(得分:0)

您的意外输出是将wget转换为抽象类而不是案例类的结果。如果您尝试使用以下行,您应该会看到查询的预期输出:

newStd

关于您的其他问题,您不需要 来单独保留它们,但这实际上取决于您的子类正在做什么。例如,如果您的子类是另一个的简单数据类型转换,那么Cassandra将自动应用此转换:

val newStd = StdAdd("S001","Xyz", 4)

如果您尝试创建一个案例类,该案例类是另一个案例类的子集,则可以使用前一个案例类代替不存在的case class StdAddConvert(id: String, name: String, class: Long) extends Student(id) val newStdConvert = StdAddConvert("S001", "Xyz", 4L) sc.parallelize(Seq(newStdConvert)).saveToCassandra("demo", "newStd") 来代替不存在的参数:

None

如果您有另一个案例类包含与初始案例基本相同的信息,但定义方式不同,您可以应用别名(和数据类型转换)保存到表中:

val noClassStd = StdAddConvert("S003", "Xyz", None)
sc.parallelize(Seq(noClassStd)).saveToCassandra("demo", "newStd")

如果您有其他案例类包含更多学生信息但延伸case class DifferentStudent(identification: String, tag: String, grade: Int) extends Student(identification) val diffStd = DifferentStudent("S003", "tag1", 12) sc.parallelize(Seq(diffStd)).saveToCassandra("demo", "newStd", columns = SomeColumns( "id" as "identification", "name" as "tag", "class" as "grade" )) 以保持Student为关键字(例如id),那么拥有它是没有意义的所有这些信息都在一个表中。相反,只要您希望在同一上下文中同时拥有两组信息,就可以创建持久化两个表并应用连接。