我正在尝试使用结构化流方法,使用基于 DataFrame/Dataset API 的 Spark-Streaming 从 Kafka 加载数据流。
我用:
- 火花 2.10
- 卡夫卡 0.10
- 火花-sql-kafka-0-10
Spark Kafka DataSource 定义了底层架构:
|key|value|topic|partition|offset|timestamp|timestampType|
我的数据采用 json 格式,它们存储在value列中。我正在寻找一种方法如何从 value 列中提取底层架构并将接收到的数据帧更新为存储在value中的列?我尝试了下面的方法,但它不起作用:
val columns = Array("column1", "column2") // column names
val rawKafkaDF = sparkSession.sqlContext.readStream
.format("kafka")
.option("kafka.bootstrap.servers","localhost:9092")
.option("subscribe",topic)
.load()
val columnsToSelect = columns.map( x => new Column("value." + x))
val kafkaDF = rawKafkaDF.select(columnsToSelect:_*)
// some analytics using stream dataframe kafkaDF
val query = kafkaDF.writeStream.format("console").start()
query.awaitTermination()
在这里我得到了异常org.apache.spark.sql.AnalysisException: Can't extract value from value#337;
,因为在创建流时,里面的值是未知的......
你有什么建议吗?