- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在命令行上使用不同于写入器架构的读取器架构来反序列化 Avro 数据。我可以在序列化时指定编写器架构,但不能在反序列化期间指定。
record.json
(数据文件):
{"test1": 1, "test2": 2}
writer.avsc
(编写器架构):
{
"type": "record",
"name": "pouac",
"fields": [
{
"name": "test1",
"type": "int"
},
{
"name": "test2",
"type": "int"
}
]
}
reader.avsc
(阅读器架构):
{
"type": "record",
"name": "pouac",
"fields": [{
"name": "test2",
"type": "int",
"aliases": ["test1"]
}]
}
序列化数据:
$ java -jar avro-tools-1.8.2.jar fromjson --schema-file writer.avsc record.json > record.avro
为了反序列化数据,我尝试了以下方法:
$ java -jar avro-tools-1.8.2.jar tojson --schema-file reader.avsc record.avro
Exception in thread "main" joptsimple.UnrecognizedOptionException: 'schema-file' is not a recognized option
...
我主要寻找命令行指令,因为我不太擅长编写 Java 代码,但我很乐意自己编译 Java 代码。实际上,我感兴趣的是确切的反序列化结果。 (更根本的问题在我为实现别名而打开的 fastavro PR 上的 this conversation 中进行了描述)
最佳答案
avro-tools tojson
目标仅用作将二进制编码的 Avro 文件转换为 JSON 的转储工具。该架构始终伴随 Avro 文件中的记录,如下面的链接所述。因此它不能被 avro-tools 覆盖。
http://avro.apache.org/docs/1.8.2/#compare
我不知道有什么独立的工具可以用来实现你想要的。我认为您需要进行一些编程才能达到预期的结果。 Avro 支持多种语言,包括 Python,但跨语言的功能并不统一。根据我的经验,Java 是最先进的。作为一个例子,Python 缺乏在 DataFileReader 上指定读取器模式的能力,这将有助于实现您想要的:
https://github.com/apache/avro/blob/master/lang/py/src/avro/datafile.py#L224
您可以在 Python 中获得最接近的结果如下;
import avro.schema as avsc
import avro.datafile as avdf
import avro.io as avio
reader_schema = avsc.parse(open("reader.avsc", "rb").read())
# need ability to inject reader schema as 3rd arg
with avdf.DataFileReader(open("record.avro", "rb"), avio.DatumReader()) as reader:
for record in reader:
print record
就您概述的架构和数据而言。预期行为应该是未定义,因此会发出错误。
可以使用以下 Java 代码验证此行为;
package ca.junctionbox.soavro;
import org.apache.avro.Schema;
import org.apache.avro.SchemaValidationException;
import org.apache.avro.SchemaValidationStrategy;
import org.apache.avro.SchemaValidator;
import org.apache.avro.SchemaValidatorBuilder;
import java.util.ArrayList;
public class Main {
public static final String V1 = "{\n" +
" \"type\": \"record\",\n" +
" \"name\": \"pouac\",\n" +
" \"fields\": [\n" +
" {\n" +
" \"name\": \"test1\",\n" +
" \"type\": \"int\"\n" +
" },\n" +
" {\n" +
" \"name\": \"test2\",\n" +
" \"type\": \"int\"\n" +
" }\n" +
" ]\n" +
"}";
public static final String V2 = "{\n" +
" \"type\": \"record\",\n" +
" \"name\": \"pouac\",\n" +
" \"fields\": [{\n" +
" \"name\": \"test2\",\n" +
" \"type\": \"int\",\n" +
" \"aliases\": [\"test1\"]\n" +
" }]\n" +
"}";
public static void main(final String[] args) {
final SchemaValidator sv = new SchemaValidatorBuilder()
.canBeReadStrategy()
.validateAll();
final Schema sv1 = new Schema.Parser().parse(V1);
final Schema sv2 = new Schema.Parser().parse(V2);
final ArrayList<Schema> existing = new ArrayList<>();
existing.add(sv1);
try {
sv.validate(sv2, existing);
System.out.println("Good to go!");
} catch (SchemaValidationException e) {
e.printStackTrace();
}
}
}
这会产生以下输出:
org.apache.avro.SchemaValidationException: Unable to read schema:
{
"type" : "record",
"name" : "pouac",
"fields" : [ {
"name" : "test2",
"type" : "int",
"aliases" : [ "test1" ]
} ]
}
using schema:
{
"type" : "record",
"name" : "pouac",
"fields" : [ {
"name" : "test1",
"type" : "int"
}, {
"name" : "test2",
"type" : "int"
} ]
}
at org.apache.avro.ValidateMutualRead.canRead(ValidateMutualRead.java:70)
at org.apache.avro.ValidateCanBeRead.validate(ValidateCanBeRead.java:39)
at org.apache.avro.ValidateAll.validate(ValidateAll.java:51)
at ca.junctionbox.soavro.Main.main(Main.java:47)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:294)
at java.lang.Thread.run(Thread.java:748)
别名通常用于模式演化中的向后兼容性,允许从不同/旧键映射到通用键名称。鉴于您的编写器模式不会通过使用联合将 test1 和 test2 字段视为“可选”,我看不出您想要这种转换的场景。如果您想“删除” test1 字段,则可以通过将其从 v2 模式规范中排除来实现。任何可以应用读取器方案的读取器都会使用 v2 架构定义忽略 test1。
为了说明我所说的进化的含义;
v1 架构
{
"type": "record",
"name": "pouac",
"fields": [
{
"name": "test1",
"type": "int"
}]
}
v2 架构
{
"type": "record",
"name": "pouac",
"fields": [
{
"name": "test2",
"type": "int",
"aliases": ["test1"]
}]
}
您可以拥有 v1 格式的 TB 数据,并引入 v2 格式,将 test1 字段重命名为 test2。该别名将允许您对 v1 和 v2 数据执行 Map-Reduce 作业、Hive 查询等,而无需先主动重写所有旧的 v1 数据。请注意,这假设字段的类型和语义没有变化。
关于java - 使用阅读器架构将 Avro 文件转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47963172/
我会保持简短:我正在尝试循环遍历画廊的 xml 文档。我有一个应该可以工作的脚本,但没有。谁能告诉我哪里做错了? 我不想让它变得更长,因为问题很简单,并且从昨天开始就一直在思考这个问题,这是我得到的最
我正在使用 PHPExcel从 Excel 工作表中读取数据并存储在 mysql 表中,直到现在我能够上传 .xls 和 .xlsx 文件,在上传 xls 后我得到了下面的数据表结构 name
我正在构建一个在线 Rss 阅读器。我希望能够与文章标题和描述一起显示图像。 我正在使用谷歌提要 API 从 CNN ( http://rss.cnn.com/rss/edition.rss ) 读取
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 10年前关闭。 Improve this
我正在开发 BB 应用程序,我需要在其中实现 QR 阅读器或扫描仪。我知道 RIM 在 OS6 和 ZXing 中支持它的库,但实际上我需要阅读一个示例,说明如何在我的代码中实现它。 最佳答案 你可以
我将工作应用程序的 clojurescript 版本升级到 0.0-2030,突然读取器/读取字符串返回空值,例如: (js/alert (str "reader returned [" (read
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想编写一个小应用程序,可以从任何 RSS 提要 URL 中提取 RSS 提要。如果有人能给我关于如何实现这一目标的非常基本的帮助? 我刚刚开始接触 AJAX 之类的东西,所以任何帮助将不胜感激。 谢
我已经创建了一个 RSS 阅读器,如下教程所示: http://techiedreams.com/android-rss-reader-part-3-action-bar-with-animated-
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
请帮我解决这个问题。我是 extJs 的新手,我需要一点帮助。我有这个代码 Ext.onReady(function() { var datesStore = new Ext.data.JsonSt
我需要一个 CSV 读取器,它将输出 NxN(加权)邻接矩阵(N 从一开始就不知道)。当然,我可以使用 strtok() 和 friend 来解析它,但是如果某些东西已经可用并且足够完整,我将不胜感激
实际上我想开发一个 EPUB 格式的图书列表(列表将从网络服务中检索)。 当选择一个项目(一本书)时,它应该会提示手机中安装了可用的 epub 阅读器。类似于“分享”将调用 SMS、FB、Twitte
我是 Java 的新手,但真的想在这方面做得更好。我正在尝试编写一个简单的 RSS 阅读器。这是代码: import java.io.*; import java.net.*; public clas
我按照一个简单的教程 (http://www.cse.nd.edu/courses/cse40814/www/RSS_Android.pdf) 将给定 URL 中的 RSS 提要读取到 ListVie
最近我一直在尝试学习如何在 Xcode 6 beta 中制作 RSS 阅读器应用程序的教程,尽管我使用的是 Xcode 6.1。我遇到了一行似乎是错误的。 完整代码为: import UIKit cl
代码使用条形码扫描仪检查条形码。Search_code 由用户(键盘)填写,insert_code 由条码扫描仪自动填写。目前,如果在条形码扫描仪值中引入两个输入,则代码可以工作,这对我来说不起作用。
是否可以通过编程方式更改 Windows 中的默认 PDF 阅读器。 例如, 如果我的机器中的默认阅读器是“Foxit”,但我需要在 C# 或 javascript 中将默认阅读器应用程序更改为“Ad
我想将 CSV 文件的每一行与其自身以及一列中的每一行进行比较。 例如,如果列值是这样的: 值_1 值_2 值_3 代码应该选择 Value_1 并将其与 Value_1(是的,也与它本身)、Valu
我有以下片段 import csv data = {} with open('data.csv', 'rb') as csvfile: spamreader = csv.reader(csvf
我是一名优秀的程序员,十分优秀!