Scala 如何读取二进制avro文件数据,源代码为akka?
我正在尝试读取一个来自akka Streams的avro文件 akka流中的Source读取FileIO.FromPath(文件)之类的数据,它将根据(\n)字符读取和分隔行,而avro如何工作 流量:Scala 如何读取二进制avro文件数据,源代码为akka?,scala,io,akka,avro,akka-stream,Scala,Io,Akka,Avro,Akka Stream,我正在尝试读取一个来自akka Streams的avro文件 akka流中的Source读取FileIO.FromPath(文件)之类的数据,它将根据(\n)字符读取和分隔行,而avro如何工作 流量: object AvroFlow { def apply(jobDate: String): Flow[GenericRecord, GenericRecord, NotUsed] = { Flow[GenericRecord].map { rec =&g
object AvroFlow {
def apply(jobDate: String): Flow[GenericRecord, GenericRecord, NotUsed] = {
Flow[GenericRecord].map { rec => rec.put("date", "20190812") rec}
}
}
图表:
object AvroRunner {
def build (src: Source[GenericRecord, NotUsed],
flw: Flow[GenericRecord, GenericRecord, NotUsed],
snk:Flow[GenericRecord, Future[Done])
: AvroRunner = {
new AvroRunner(srtc,flw,snk)
}
}
class AvroRunner private(src: Source[GenericRecord, NotUsed],
flw: Flow[GenericRecord, GenericRecord, NotUsed],
snk:Flow[GenericRecord, Future[Done]){
import scala.concurrent.ExecutionContext.Implicits.global
val GraphRunner = RunnableGraph.fromGraph(GraphDSL.create() {implicit builder =>
import GraphDSL.Implicits._
src ~> flw ~> snk
ClosedShape
})
}
创建avro数据对象的akka
源代码的最简单方法不是从原始二进制文件本身。而是从avro库提供的DataFileReader
创建源代码
从开始,我们首先从java.io.file
生成器创建文件读取器:
def createFileReader[T : ClassTag](fileGenerator : () => File) : DataFileReader[T] =
new DataFileReader[T](file(), new SpecificDatumReader[T](classTag[T].runtimeClass))
def fileToAvroSource[T](fileGenerator : () => File) : Source[T, _] =
Source.fromIterator[T](() => dataFileReaderToIterator[T](createFileReader(fileGenerator)))
然后可以使用它创建scala迭代器
:
def dataFileReaderToIterator[T](dataFileReader : DataFileReader[T]) : Iterator[T] =
new Iterator[T] {
override def hasNext : Boolean = dataFileReader.hasNext
override def next() : T = dataFileReader.next
}
现在,我们可以从文件生成器构造流源:
def createFileReader[T : ClassTag](fileGenerator : () => File) : DataFileReader[T] =
new DataFileReader[T](file(), new SpecificDatumReader[T](classTag[T].runtimeClass))
def fileToAvroSource[T](fileGenerator : () => File) : Source[T, _] =
Source.fromIterator[T](() => dataFileReaderToIterator[T](createFileReader(fileGenerator)))
背压?
avro似乎正在使用标准的BufferedReader/OutputStream技术来读取文件
。因此,上面的实现应该一直提供到文件源的反压力。然而,我还没有证实这是真的……嗨,拉蒙,谢谢你的回复。我从迭代器()创建了源代码,但是当我将源代码连接到流[GenericRecord,GenericRecord,389;]时,流没有得到任何记录。但在原始资料中我可以打印记录。我在这里遗漏的任何东西。。。例如:Flow[genericord].map{x.put(dt,“20190624”)}@Aravinda欢迎你。我必须查看您的流
代码和流代码,才能调试…@J Romero Vigil,我已将代码与问题一起包含在上面的标记中。有什么我遗漏的吗。