读取 Avro 文件时不是数据文件错误
Not a data file error while reading Avro file
我有一个包含 Avro 格式数据的文件。我想将这些数据读入 GenericRecord 类型的数据结构或任何其他类型的数据结构,这样我就可以将它从 Kafka 发送到 Spark。
我尝试使用 DataFileReader,但结果是这个错误:
Exception in thread "main" java.io.IOException: Not a data file.
at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105)
这是生成它的代码:
val schema = Source.fromFile(schemaPath).mkString
val parser = new Schema.Parser
val avroSchema = parser.parse(schema)
val avroDataFile = new File(dataPath)
val avroReader = new GenericDatumReader[GenericRecord](avroSchema)
val dataFileReader = new DataFileReader[GenericRecord](avroDataFile, avroReader)
//THIS LINE PRODUCED ERROR
我该如何解决这个错误?
这是我的 Avro 数据模式的样子:
{
"type" : "record",
"namespace" : "input_data",
"name" : "testUser",
"fields" : [
{"name" : "name", "type" : "string", "default": "NONE"},
{"name" : "age", "type" : "int", "default": -1},
{"name" : "phone", "type" : "string", "default" : "NONE"},
{"name" : "city", "type" : "string", "default" : "NONE"},
{"name" : "country", "type" : "string", "default" : "NONE"}
]
}
这是我试图读取的数据(由 this tool 生成):
{
"name" : "O= ~usP3\u0001\bY\u0011k\u0001",
"age" : 585392215,
"phone" : "\u0012\u001F#\u001FH]e\u0015UW\u0000\fo",
"city" : "aWi\u001B'\u000Bh\u00163\u001A_I\u0001\u0001L",
"country" : "]H\u001Dl(n!Sr}oVCH"
}
{
"name" : "\u0011Y~\fV\u001Dv%4\u0006;\u0012",
"age" : -2045540864,
"phone" : "UyOdgny-hA",
"city" : "\u0015f?\u0000\u0015oN{\u0019\u0010\u001D%",
"country" : "eY>c\u0010j\u0002[\u001CdDQ"
}
...
好吧,那个数据不是 Avro,而是 JSON。
如果它是二进制 Avro 数据,您将无法在不先使用 avro-tools.jar tojson
操作的情况下读取文件。
如果您查看使用文档,JSON 是默认值
-j, --json: Encode outputted data in JSON format (default)
要真正获得 Avro,请使用 arg -s schema.avsc -b -o out.avro
我有一个包含 Avro 格式数据的文件。我想将这些数据读入 GenericRecord 类型的数据结构或任何其他类型的数据结构,这样我就可以将它从 Kafka 发送到 Spark。
我尝试使用 DataFileReader,但结果是这个错误:
Exception in thread "main" java.io.IOException: Not a data file.
at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105)
这是生成它的代码:
val schema = Source.fromFile(schemaPath).mkString
val parser = new Schema.Parser
val avroSchema = parser.parse(schema)
val avroDataFile = new File(dataPath)
val avroReader = new GenericDatumReader[GenericRecord](avroSchema)
val dataFileReader = new DataFileReader[GenericRecord](avroDataFile, avroReader)
//THIS LINE PRODUCED ERROR
我该如何解决这个错误?
这是我的 Avro 数据模式的样子:
{
"type" : "record",
"namespace" : "input_data",
"name" : "testUser",
"fields" : [
{"name" : "name", "type" : "string", "default": "NONE"},
{"name" : "age", "type" : "int", "default": -1},
{"name" : "phone", "type" : "string", "default" : "NONE"},
{"name" : "city", "type" : "string", "default" : "NONE"},
{"name" : "country", "type" : "string", "default" : "NONE"}
]
}
这是我试图读取的数据(由 this tool 生成):
{
"name" : "O= ~usP3\u0001\bY\u0011k\u0001",
"age" : 585392215,
"phone" : "\u0012\u001F#\u001FH]e\u0015UW\u0000\fo",
"city" : "aWi\u001B'\u000Bh\u00163\u001A_I\u0001\u0001L",
"country" : "]H\u001Dl(n!Sr}oVCH"
}
{
"name" : "\u0011Y~\fV\u001Dv%4\u0006;\u0012",
"age" : -2045540864,
"phone" : "UyOdgny-hA",
"city" : "\u0015f?\u0000\u0015oN{\u0019\u0010\u001D%",
"country" : "eY>c\u0010j\u0002[\u001CdDQ"
}
...
好吧,那个数据不是 Avro,而是 JSON。
如果它是二进制 Avro 数据,您将无法在不先使用 avro-tools.jar tojson
操作的情况下读取文件。
如果您查看使用文档,JSON 是默认值
-j, --json: Encode outputted data in JSON format (default)
要真正获得 Avro,请使用 arg -s schema.avsc -b -o out.avro