saveAsCassandraTable不是.... dstream.DStream [(String,Int,String)]的成员

时间:2017-04-28 19:37:56

标签: scala apache-spark cassandra

当我尝试使用 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

的任何建议

1 个答案:

答案 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代码路径上完成的,而是独立管理的。