Scala 找不到数据集中存储的类型的编码器。在spark结构化流媒体中
我正在尝试spark网站上提供的spark结构化流媒体示例,但它抛出了错误Scala 找不到数据集中存储的类型的编码器。在spark结构化流媒体中,scala,apache-spark,apache-kafka,spark-structured-streaming,Scala,Apache Spark,Apache Kafka,Spark Structured Streaming,我正在尝试spark网站上提供的spark结构化流媒体示例,但它抛出了错误 +-----+--------+ | name| id +-----+--------+ |Jacek| 1 +-----+--------+ 1。找不到数据集中存储的类型的编码器。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。\在将来的版本中将添加对序列化其他类型的支持。 +-----+--------+ | name| id +-----+--
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
1。找不到数据集中存储的类型的编码器。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。\在将来的版本中将添加对序列化其他类型的支持。
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
2。方法as的参数不足:(隐式证据$2:org.apache.spark.sql.Encoder[data])org.apache.spark.sql.Dataset[data]。
未指定值参数证据$2。
val ds:Dataset[data]=df.as[data]
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
这是我的密码
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types._
import org.apache.spark.sql.Encoders
object final_stream {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.appName("kafka-consumer")
.master("local[*]")
.getOrCreate()
import spark.implicits._
spark.sparkContext.setLogLevel("WARN")
case class data(name: String, id: String)
val df = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "172.21.0.187:9093")
.option("subscribe", "test")
.load()
println(df.isStreaming)
val ds: Dataset[data] = df.as[data]
val value = ds.select("name").where("id > 10")
value.writeStream
.outputMode("append")
.format("console")
.start()
.awaitTermination()
}
}
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
有关于如何使这项工作的任何帮助吗。?
我想要这样的最终输出
我想要这样的输出
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
该错误是由于dataframe中的列数与您的case类不匹配造成的
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
scala> println(schema.treeString)
root
|-- key: binary (nullable = true)
|-- value: binary (nullable = true)
|-- topic: string (nullable = true)
|-- partition: integer (nullable = true)
|-- offset: long (nullable = true)
|-- timestamp: timestamp (nullable = true)
|-- timestampType: integer (nullable = true)
在dataframe中有[主题、时间戳、值、键、偏移量、时间戳类型、分区]
列
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
而您的case类只有两列
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
case class data(name: String, id: String)
您可以将dataframe的内容显示为
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
val display = df.writeStream.format("console").start()
睡几秒钟,然后
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
display.stop()
还可以使用前面提到的选项(“起始偏移量”、“最早”)
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
然后根据您的数据创建一个案例类
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
希望这有帮助 出现错误的原因是您正在处理来自Kafka的
数组[Byte]
,并且没有与数据
案例类匹配的字段
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
scala> println(schema.treeString)
root
|-- key: binary (nullable = true)
|-- value: binary (nullable = true)
|-- topic: string (nullable = true)
|-- partition: integer (nullable = true)
|-- offset: long (nullable = true)
|-- timestamp: timestamp (nullable = true)
|-- timestampType: integer (nullable = true)
将行df.as[data]
更改为以下内容:
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+
df.
select($"value" cast "string").
map(value => ...parse the value to get name and id here...).
as[data]
我强烈建议使用
选择
和函数
对象来处理传入的数据。您能将案例类移出最终的\u流对象并运行吗?如果我将案例类移出对象,它将显示错误“线程中的异常”主线程“org.apache.spark.sql.AnalysisException:无法解析给定输入列“name
”:[主题、时间戳、值、键、偏移量、时间类型、分区];“您的数据包含[topic、timestamp、value、key、offset、timestampType、partition],但您的case类只包含name和id如何解决此错误?我只想通过thread中的structured streamingException将kafka的json字符串显示到spark控制台”main“org.apache.spark.sql.AnalysisException:具有流媒体源的查询必须使用writeStream.start()执行;”;;运行df.show()时我想要这样的输出+-----++-------------+----名称| id++-------------+----Jacek | 1++--------------希望这会有帮助,抱歉我们不能使用。用Streaming显示上述解决方案也不起作用。有人能帮我提供完整的解决方案吗?你能给出如何解析名称的示例吗和idSure,但这取决于如何通过导线发送带有名称和id的字符串。如何发布卡夫卡主题?
+-----+--------+
| name| id
+-----+--------+
|Jacek| 1
+-----+--------+