我想通过Spark结构化流API从s3中读取Avro文件。您可以找到有关使用Kafka进行此操作的信息,但我找不到s3的任何内容。这里的问题是我不知道要设置什么格式。这是我的简单代码:
Dataset<Row> baseDataSet = sparkSession
.readStream()
.format("?") //What this format should be?
.schema(new StructType()
.add("value", "binary"))
.load("s3://path/to/streaming/key")
.select(col("value"))
.map(value -> {//do avro deserialization},Encoders.kryo(//deserialization class))
.writeStream()
.trigger(ProcessingTime.create(10, TimeUnit.SECONDS))
.format("console")
.outputMode("update")
.start();
据我所知,avro仍未在结构化流API中实现。但是我应该采用什么格式来读取二进制数据,然后以我想要的任何方式对其进行反序列化(在map函数中)。
答案 0 :(得分:0)
有一个third-party package for avro。您可以通过指定format("com.databricks.spark.avro")
来下载jar并将其与spark一起使用以直接加载avro文件。
目前,无法在结构化流媒体中读取整个文件以便稍后应用反序列化。
但是,如果您仍想要自定义反序列化器,则可以通过实现trait DataSourceRegister
来开发自定义数据源。例如,您可能需要检查spark-avro package。
如果您需要将输入数据转换为字节数组,可以使用以下内容:
session
.readStream()
.textFile("path-to-folder")
.as(Encoders.BINARY())
.map(bytesToStringMapper, Encoders.STRING())
.writeStream()
.outputMode(OutputMode.Append())
.format("text")
.option("path", "path-to-folder")
.option("checkpointLocation", "path-to-folder")
.queryName("test-query")
.start();
当前方法逐行加载文件作为文本。这意味着bytesToStringMapper
接收单行作为字节数组并将其转换为字符串。