例外:“ writeStream”只能在流式数据集/ DataFrame上调用

时间:2018-07-18 17:39:41

标签: scala apache-spark spark-streaming

尝试为Spark数据流的writeStream函数创建测试,如下所示:

SparkSession spark = SparkSession.builder().master("local").appName("spark 
session").getOrCreate()

val lakeDF = spark.createDF(List(("hi")), List(("word", StringType, true)))

lakeDF.writeStream
  .trigger(Trigger.Once)
  .format("parquet")
  .option("checkpointLocation", checkpointPath)
  .start(dataPath)

但是我遇到以下异常: org.apache.spark.sql.AnalysisException:'writeStream'只能在流数据集/ DataFrame上调用;

我是流媒体的新手,请让我知道如何创建流数据帧/将上述常规数据帧转换为测试套件的流数据帧。

2 个答案:

答案 0 :(得分:1)

在Spark结构化流中,使用SparkSession上的 readStream 在流中创建数据帧/数据集。如果未使用流创建数据帧/数据集,则不允许使用 writeStream 进行存储。

因此,使用 readStream 创建数据框/数据集,并使用 writeStream

存储数据框/数据集。
 val kafkaStream = sparkSession.readStream.format("kafka")
.option("kafka.bootstrap.servers", "kafka-broker-hostname:port")
.option("subscribe", "topicname")
.load()

答案 1 :(得分:-1)

请考虑以下示例。

第一个适用于不流式传输的df。喜欢你的通过列表/序列创建的文件或df。

// Write key-value data from a DataFrame to a specific Kafka topic specified in an option
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .write
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
  .option("topic", "topic1")
  .save()

第二个适用于流式传输的数据帧。例如从kafka或其他流媒体来源阅读。

// 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()

使用流数据框或像第一个示例一样更改代码。