我有一个基类:
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"
答案 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
),那么拥有它是没有意义的所有这些信息都在一个表中。相反,只要您希望在同一上下文中同时拥有两组信息,就可以创建持久化两个表并应用连接。