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

How can I import CSV files into HIVE using an external schema (like Avro)?

我正在将压缩的 csv-like 日志文件(分隔符分隔,没有 header)导入 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. Using the Avro tools 非常适合 JSON 但不适用于 CSV。

我最终使用 Apache Kite, a good tutorial can be found on kitesdk.org 完成了此操作。

首先,您需要从 Avro 模式创建 Hive table:

kite-dataset create sandwiches -s sandwich.avsc

然后就可以将csv数据导入到table.

kite-dataset csv-import sandwiches.csv sandwiches

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