如何将数据从csv加载到配置单元外部表(avro格式)?

nr7wwzry  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(408)

我尝试构建一个直线脚本,将hdfs中存储的csv文件加载到hive中的一个外部表中。首先,我创建一个空的外部表:

CREATE EXTERNAL TABLE IF NOT EXISTS db.table
(column string)
STORED AS AVRO
LOCATION '/foo/bar'

之后,我检查表是否已创建。是的。我已经将一个csv文件加载到hdfs中:

hdfs dfs -put test.csv /temp/raw_csv

现在我想将这个csv数据加载/插入到外部配置单元表中,但是存储在avrofromat中(就像在create脚本中定义的那样)。我试过这句话:

LOAD DATA INPATH '/temp/raw_csv/test.csv' OVERWRITE INTO TABLE db.table

此行运行时没有错误,请参见此处的cmd输出:
. . . . . . . . . . . . . . . . . . . . . . .> . . . . . . . . . . . . . . . . . . . . . . .> 信息:编译命令(queryid=hive\u 20201201130808\u 4120504b-6799-4833-83e7-5fa8ff8c6ca8):将路径“/temp/raw\u csv/test.csv”中的数据加载到表db中。表信息:语义分析完成信息:返回配置单元架构:架构(fie)ldschemas:null,properties:null)信息:已完成编译命令(queryid=hive\u 20201201130808\u 4120504b-6799-4833-83e7-5fa8ff8c6ca8);所用时间:0.427秒信息:正在执行命令(queryid=hive\u 20201201130808\u 4120504b-6799-4833-83e7-5fa8ff8c6ca8):在路径“/temp/raw\u csv/test.csv”中将数据加载到表db中。表信息:在串行模式下启动任务[stage-0:move]信息:从hdfs://temp/raw_csv/test.csv 信息:开始任务[stage-1:stats]在串行模式信息:table db.table stats:[numfiles=1,totalsize=45981179]信息:已完成执行命令(queryid=hive\u 20201201130808\u 4120504b-6799-4833-83e7-5fa8ff8c6ca8);所用时间:0.376秒信息:确定不影响行(0.87秒)
但是如果我想选择下一行的表,我会得到一个错误:

select * FROM db.test;

信息:编译命令(queryid=hive\u 20201201131414\u 79187a87-c5e6-4b54-aecc-54c15d9a4bfa):从数据库选择测试信息:语义分析完成信息:返回配置单元架构:架构(fieldschemas:[fieldschema(name:column, type:string, comment:null)信息:已完成编译命令(queryid=hive\u 20201201131414\u 79187a87-c5e6-4b54-aecc-54c15d9a4bfa);所用时间:0.243秒信息:正在执行命令(queryid=hive\u 20201201131414\u 79187a87-c5e6-4b54-aecc-54c15d9a4bfa):从数据库中选择测试信息:已完成执行命令(queryid=hive\u 20201201131414\u 79187a87-c5e6-4b54-aecc-54c15d9a4bfa);所用时间:0.006秒信息:确定错误:java.io.ioexception:java.io.ioexception:不是数据文件(状态=,代码=0)
是否可以使用直线命令将数据从csv加载到hive avro表?和/或加载此数据的更好方法是什么?我通常加载1-1亿行数据。

rseugnpd

rseugnpd1#

这样不行。load命令不转换数据,它只是将文件移到表位置。
如果你想从 CSVAVRO ,然后执行以下步骤:
创建csv表
使用将文件直接放入表位置 hdfs dfs -put 或使用
将数据本地inpath'local/path/to/csv'覆盖加载到表db.csv\u表中
创建avro表
使用配置单元将数据从csv表加载到avro
插入覆盖表avro\u table select。。。从csv表
serde负责读取和写入数据文件,当您使用某些特定serde创建表并选择或插入数据时,将使用serde。load对文件架构一无所知,也不使用serde。在最后一步(4)中,hive将读取csv表并将相同的数据插入avro表,它将使用两个表中指定的serde ddl将数据序列化为avro格式并从csv反序列化。
或者,您可以使用csv2avro工具或其他工具将csv文件转换为avro文件,然后将其加载到avro表位置。
如果您没有从csv转换到avro的目的,只是将数据加载到表中以便能够选择它,那么您所需要的只是创建csv表并将数据文件放入它的位置(步骤1和2)。

相关问题