读取Avro文件时没有数据文件错误

时间:2019-01-17 15:31:48

标签: scala avro avro-tools

我有一个文件,数据格式为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"
}
...

1 个答案:

答案 0 :(得分:1)

好吧,该数据不是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

还有其他方法generate test data in Kafka