也许有人在某个项目中使用了它:我从Spark写入Cassandra,在Spark中我使用kafkaUtils.createDirectStream
。通过Spark-Cassandra连接器,我们可以使用Dstream.saveToCassandra
方法。但是为了保存/附加到hdfs我使用:
stream.map(_.value).foreachRDD(rdd => {
val conf = new Configuration()
conf.set("fs.defaultFS", "hdfs://127.0.0.1:9000/")
val fs = FileSystem.get(conf)
fs.append(new Path("textfile.txt"))
.write(rdd.collect().mkString.getBytes())
fs.close()
})
但我不认为这是最好的方法。使用类似的东西可能更好:
val prepStr = {
val str = new StringBuilder
if (!rdd.isEmpty()) {
str.append(rdd.collect().mkString)
}
str
}
最后:
fs.append(path).write(prepStr.mkString.getBytes())
或许有人用另一种方式?
答案 0 :(得分:1)
假设您的流类型为DStream[String]
,您可以使用数据框编写器提供的追加功能:
dstream.foreachRDD{rdd =>
import sparkSession.implicits._
val df = rdd.toDF()
df.write.mode("append").text("/hdfs/path/to/file")
}