Scala 找不到数据集中存储的类型的编码器。在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 +-----+--

我正在尝试spark网站上提供的spark结构化流媒体示例,但它抛出了错误

+-----+--------+
| 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
+-----+--------+