【问题标题】:Only parent class columns created cassandra using cassandra-spark connector只有父类列使用 cassandra-spark 连接器创建了 cassandra
【发布时间】:2015-11-03 03:33:08
【问题描述】:

我有一个基类:

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"

【问题讨论】:

  • 您的示例的初始化已将newStd 转换为您的抽象类。您可以尝试用val newStd = StdAdd("S001","Xyz", "4") 替换它并再次运行它吗?
  • 如果我有两个子类怎么办?我需要单独持久化它们吗?
  • 添加了一个答案,希望包含一些与您的其他问题相关的信息。

标签: scala cassandra apache-spark


【解决方案1】:

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

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

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

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 作为键(例如,case class StdInfo(id: String, address: String, dob: Long) extends Student(id))时,将所有这些信息放在一个中实际上没有意义桌子。相反,您可以创建持久化两个表并在您希望将两组信息放在同一上下文中时应用连接。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2015-05-24
    • 1970-01-01
    • 2018-06-10
    • 2014-12-19
    相关资源
    最近更新 更多