【问题标题】:Is it possible to read/decode .avro uInt8Array Container File with Javascript in Browser?是否可以在浏览器中使用 Javascript 读取/解码 .avro uInt8Array 容器文件?
【发布时间】:2021-11-25 19:13:03
【问题描述】:

我正在尝试解码从 Web 服务器加载的 .avro 文件。

由于 uInt8Array 的字符串版本以
开头 "来自 S3 Objavro.schema 的缓冲区。{"type":"record","name":"Destination",..."
我假设它是 avro 容器文件

我发现 'avro.js' 和 'avsc' 作为使用 .avro 格式和 javascript 的工具,但阅读文档听起来好像容器文件的解码只能在 Node.js 中进行,而不是在浏览器。 (FileDecoder/Encoder 方法将文件路径作为字符串,而不是 uInt8Array)

是我弄错了,还是有其他方法可以在浏览器中使用 javascript 解码 .avro 容器文件?

【问题讨论】:

    标签: javascript browser avro


    【解决方案1】:

    感谢发帖!

    以下是我将 avro/binary 与 axios 的集成,以防其他人尝试实现浏览器端解码:

    [浏览前]

    const axios = require('axios')
    const avro = require('avsc')
    
    const config = {
      responseType: 'blob'
    };
    
    const url = 'https://some-url.com'
    
    axios.get(url, config)
    .then(res => {
      avro.createBlobDecoder(res.data)
        .on('metadata', (type) => console.log(type))
        .on('data', (record) => console.log(record))
    })
    .catch(e => console.error(e))
    

    【讨论】:

      【解决方案2】:

      幸运的是,我找到了一种将 avscbroserify

      结合使用的方法
      avro.createBlobDecoder(blob, [{options}])
      
      [avro.js - 浏览前]
      var avro = require('avsc');
      
      const AVRO = {
      
      decodeBlob(blob) {
      
              let schema, columnTitles, columnTypes, records = []
      
              return new Promise((resolve) => {
                  avro.createBlobDecoder(blob, {
                      // noDecode: true
                  })
                      .on('metadata', (s) => {
                          schema = s
                          columnTitles = schema.fields.map(f => f.name)
                          columnTypes = schema.fields.map(f => f.type)
                      })
                      .on('data', (data) => {
                          records.push(data)
                      })
                      .on('finish', () => {
                          resolve(
                              {
                                  columnTitles: columnTitles,
                                  columnTypes: columnTypes,
                                  records: records
                              }
                          )
                      })
              })
          }
      }
      
      module.exports = AVRO
      
      [package.json]
      "scripts": {
          "avro": "browserify public/avro.js --s AVRO > public/build/avro.js"
        }
      
      [someOtherFile.js]
      //s3.getObject => uInt8array
      
      const blob = new Blob([uInt8array])  //arr in brackets !important
      
      const avroDataObj = await AVRO.decodeBlob(blob)
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-13
        • 1970-01-01
        • 2020-02-23
        • 2010-10-19
        相关资源
        最近更新 更多