Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何读取二进制avro文件数据,源代码为akka?_Scala_Io_Akka_Avro_Akka Stream - Fatal编程技术网

Scala 如何读取二进制avro文件数据,源代码为akka?

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

我正在尝试读取一个来自akka Streams的avro文件

akka流中的Source读取FileIO.FromPath(文件)之类的数据,它将根据(\n)字符读取和分隔行,而avro如何工作

流量:

    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,我已将代码与问题一起包含在上面的标记中。有什么我遗漏的吗。