如何使用外部架构(如Avro)将CSV文件导入HIVE?

时间:2016-04-12 16:06:15

标签: csv hadoop hive schema avro

我将压缩的类似csv的日志文件(分隔符分隔,没有标题)导入HDFS,并希望使用HIVE聚合它们。但是,我喜欢将(声明性)模式与聚合查询分开的想法,因为它是一种跟踪模式历史记录的简洁方法。

是否有(直接)方法使用外部架构(如Avro)将csv文件导入HIVE?如果没有,有两个步骤更好的方法,还是只能在HQL中指定文件结构?

到目前为止,我尝试在HIVE中同时使用Avro和CSV序列化而没有成功。

我的csv文件test.log.gz看起来像这样

val0|val1|val2||val3
val4|val5|val6||val7

我创建了一个Avro架构test.avsc

{
  "type": "record",
  "namespace": "test",
  "name": "TestFile",
  "fields": [
     { "name": "field0" , "type": "string", "doc": "Field 0" },
     { "name": "field1" , "type": "string", "doc": "Field 1" },
     { "name": "field2" , "type": "null", "doc": "N/A" },
     { "name": "field3" , "type": "string", "doc": "Field 3" }
  ]
}

我之所以这样做,是因为我可以为(长)文件规范提供一个单独的位置,包括以可读格式描述字段。

更新1:

我还在考虑事先将CSV文件转换为Avro格式。但是,我发现this is also done via HIVE。通过命令行使用Avro tools对JSON非常有效,但对CSV无效。

1 个答案:

答案 0 :(得分:1)

我最后使用Apache Kite执行此操作,可以在kitesdk.org上找到一个好的教程。

首先,您需要从Avro架构创建Hive表:

kite-dataset create sandwiches -s sandwich.avsc

然后您可以将csv数据导入表格。

kite-dataset csv-import sandwiches.csv sandwiches

这是我的资源声明和版本模式,并从命令行将csv文件导入Hive。