是否可以在浏览器中 read/decode .avro uInt8Array 容器文件 Javascript ?
Is it possible to read/decode .avro uInt8Array Container File with Javascript in Browser?
我正在尝试解码从网络服务器加载的 .avro 文件。
因为 uInt8Array 的字符串版本以
开头
“来自 S3 的缓冲区 Objavro.schema�{"type":"record","name":"Destination",..."
我假设它是 avro Container File
我发现“avro.js' and 'avsc”是使用 .avro 格式和 javascript 的工具,但阅读文档听起来好像只能在 [=25= 中解码容器文件],而不是在浏览器中。
(FileDecoder/Encoder 方法将文件路径作为字符串,而不是 uInt8Array)
我是不是理解错了,还是有其他方法可以使用 javascript 在浏览器中解码 .avro 容器文件?
幸运的是,我找到了一种使用 avsc 和 broserify
的方法
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)
感谢发帖!
下面是我对 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))
我正在尝试解码从网络服务器加载的 .avro 文件。
因为 uInt8Array 的字符串版本以
开头
“来自 S3 的缓冲区 Objavro.schema�{"type":"record","name":"Destination",..."
我假设它是 avro Container File
我发现“avro.js' and 'avsc”是使用 .avro 格式和 javascript 的工具,但阅读文档听起来好像只能在 [=25= 中解码容器文件],而不是在浏览器中。 (FileDecoder/Encoder 方法将文件路径作为字符串,而不是 uInt8Array)
我是不是理解错了,还是有其他方法可以使用 javascript 在浏览器中解码 .avro 容器文件?
幸运的是,我找到了一种使用 avsc 和 broserify
的方法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)
感谢发帖!
下面是我对 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))