我将压缩的类似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" }
]
}
我之所以这样做,是因为我可以为(长)文件规范提供一个单独的位置,包括以可读格式描述字段。
我还在考虑事先将CSV文件转换为Avro格式。但是,我发现this is also done via HIVE。通过命令行使用Avro tools对JSON非常有效,但对CSV无效。
答案 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。