当我尝试使用 saveAsCassandraTable
向Cassandra加载实时推文时,我收到以下错误 value saveAsCassandraTable is not a member of org.apache.spark.streaming.dstream.DStream[(String, Int, String)]
我可以使用 saveToCassandra 成功导出。到目前为止,我可以放在一起的代码是 -
val tags = stream.map(_.getText).filter(_.startsWith("@xyz"))
val Counts = tags.map((_, 1)).reduceByKeyAndWindow((x: Int, y: Int) => x + y, windowLength, slideInterval)
val CountsAll = Counts.map{case (tag, counter) => (tag, counter, "Everything")}
CountsAll.saveAsCassandraTable("demo1", "tags1")
我的要求是scala同时将推文加载到Cassandra的两个不同的表中。 一个是Cassandra中的预定义表,另一个是每次加载推文时动态创建表。推文以2000秒的间隔加载。
了解有关如何执行saveAsCassandraTable
答案 0 :(得分:2)
与@ user6910411相同,您的错误告诉您,您正尝试在saveAsCassandraTable
上致电DStream
。
您只能在RDD[T]上使用它,例如RDD[(String, Int, String)]
。
你想要这样的东西:
CountsAll.foreachRDD{ rdd =>
rdd.saveAsCassandraTable("demo1", "tags1")
}
<强>更新强>
RDD API不支持截断等。 您可能应该在Spark代码路径之外管理模式。 但是,要直接解决您的要求:
val conn: CassandraConnector = CassandraConnector(sparkConf())
conn.withSessionDo { session =>
session.execute(s"""CREATE TABLE tags1..."")
}
}
其中sparkConf()
返回带有Cassandra设置的spark配置对象。
.withSessionDo
为您提供DataStax C *驱动程序中的Session
对象,以便您可以随意执行任何操作。
同样,我建议模式管理不是直接在Spark代码路径上完成的,而是独立管理的。