我尝试在配置单元中创建一个表,并希望将其导出为avro格式。
最后我想把这个avro文件加载到googlebigquery。由于某些原因,在导出之后,avro模式没有正确的列名。
create table if not exists test_txt (id int, name varchar(40));
insert into test values (1, "AK");
insert overwrite directory "/tmp/test" stored as avro select * from test;
!sh hadoop fs -cat /tmp/test/*;
输出的列名应为id,name,但翻译为\u col0,\u col1。
objavro.schema▒{"type“:”record“,”name“:”baserecord“,”fields“:[{”name“:”varchar“,”type“:[”null“,”int“,”default“:null},{”name“:”null“,”type“,{”type“:”string“,”logicaltype“:”varchar“,”maxlength“:40}],”default“:null}}▒波黑▒▒δ*@▒十~ AK▒Bh▒▒δ*@▒x~
谢谢,
阿克
2条答案
按热度按时间vtwuwzda1#
这似乎是使用导出时的预期行为
insert overwrite directory
条款。这个旧的线程是关于这个问题的。它已经很老了,但我相信结论仍然是正确的(至少我找不到保留列名的直接方法)。它确实包含了一些解决这个问题的技巧,因此可能值得一读。t9eec4r02#
如果一个avro二进制文件需要导出到一个单独的文件以便进一步接收(在bigquery的上下文中),那么不要使用hadoopcat/insert overwrite语句。使用avro工具和concat创建一个大的avro文件。
hadoop jar avro-tools-1.8.2.jar concat/tmp/test\u avro/*big\u avro\u table.avro