我正在使用提供流的twitter流功能。我需要使用Spark writeStream函数,例如:writeStream function link
// Write key-value data from a DataFrame to a specific Kafka topic specified in an option
val ds = df
.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
.writeStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("topic", "topic1")
.start()
“ df”必须是流数据集/ DataFrame。如果df是正常的DataFrame,则会显示错误消息,表明“ writeStream”只能在流式Dataset / DataFrame上调用;
我已经做了: 1.从推特获取流 2.过滤并映射它以获得每个twitt(正,负,自然)的标签
最后一步是对标签进行分组并计数,然后将其传递给Kafka。
你们是否知道如何将Dstream转换为流数据集/ DataFrame?
编辑:ForeachRDD函数确实将Dstream更改为普通DataFrame。 但是'writeStream'只能在流媒体上调用 数据集/数据框。 (上面提供了writeStream链接)
org.apache.spark.sql.AnalysisException:'writeStream'只能在流数据集/ DataFrame上调用;
答案 0 :(得分:1)
如何将Dstream转换为流数据集/ DataFrame?
DStream
是一系列RDD的抽象。
流Dataset
是一系列Dataset
的“抽象”(我使用引号是因为流Dataset
和批处理isStreaming
之间的区别是属性Dataset
DStream
)。
可以将Dataset
转换为流DStream
,以保持DStream
的行为。
我认为您并不是真的想要它。
您需要做的就是使用val spark: SparkSession = ...
val tweets = DStream...
tweets.foreachRDD { rdd =>
import spark.implicits._
rdd.toDF.write.format("kafka")...
}
收集推文并将其保存到Kafka主题中(并且您认为您需要结构化流)。我认为您只需要Spark SQL(结构化流的底层引擎)即可。
伪代码如下(很抱歉,自从我使用老式的Spark Streaming以来,时间已经更长了):
const [errors, setErrors] = useState<Map<string, string>>(null);
let copy: Map<string,string> = new Map<string,string>(errors);
copy["a"] = "a";
setErrors(copy);
let copy2: Map<string,string> = new Map<string,string>(errors);
copy2.delete("a");
setErrors(copy2);