如何使用writeStream将Spark流传递给kafka主题

时间:2019-11-13 06:01:38

标签: apache-kafka spark-streaming spark-structured-streaming

我正在使用提供流的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上调用;

1 个答案:

答案 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);