我尝试构建一个直线脚本,将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亿行数据。
1条答案
按热度按时间rseugnpd1#
这样不行。load命令不转换数据,它只是将文件移到表位置。
如果你想从
CSV
至AVRO
,然后执行以下步骤:创建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)。