Hadoop 使用stdout重定向创建要加载到配置单元表中的临时文件
我想创建一个脚本,将tsv文件加载到配置单元中。 但是,由于.tsv文件包含头文件 所以我首先要创建一个没有它的临时文件 在my script.hql中,我有以下内容:Hadoop 使用stdout重定向创建要加载到配置单元表中的临时文件,hadoop,hive,stdout,io-redirection,Hadoop,Hive,Stdout,Io Redirection,我想创建一个脚本,将tsv文件加载到配置单元中。 但是,由于.tsv文件包含头文件 所以我首先要创建一个没有它的临时文件 在my script.hql中,我有以下内容: DROP TABLE metadata IF EXISTS ; CREATE TABLE metadata ( id INT, value STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE ; ! tail -n
DROP TABLE metadata IF EXISTS ;
CREATE TABLE metadata (
id INT,
value STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE ;
! tail -n +2 metadata.tsv > tmp_metadata.tsv ;
LOAD DATA LOCAL 'tmp_metadata.tsv' INTO metadata ;
问题是,hive抱怨
,这会导致重定向到新脚本失败,因此脚本失败
如何修复此问题?1。创建一个名为
script.sh的新shell脚本,并将其添加到shell脚本中:
#!/bin/sh
tail -n +2 metadata.tsv > tmp_metadata.tsv
hive -v -f ./script.hql
2.而不是您的脚本。hql
:
DROP TABLE IF EXISTS metadata;
CREATE TABLE metadata (
id INT,
value STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE ;
LOAD DATA LOCAL INPATH 'tmp_metadata.tsv' INTO TABLE metadata ;
删除表元数据(如果存在)
创建表元数据(id INT,值字符串)行格式分隔字段,以存储为TEXTFILE的“\t”终止
!!tail-n+2 metadata.tsv>tmp_metadata.tsv
将数据本地“tmp_metadata.tsv”加载到元数据中强>
将此添加到脚本中。hql
:
DROP TABLE IF EXISTS metadata;
CREATE TABLE metadata (
id INT,
value STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE ;
LOAD DATA LOCAL INPATH 'tmp_metadata.tsv' INTO TABLE metadata ;
删除表元数据(如果存在)代码>不正确。如果存在元数据,则将其更改为DROP TABLE代码>
及
将数据本地“tmp_metadata.tsv”加载到元数据中代码>不正确。更改为LOAD DATA LOCAL INPATH'tmp_metadata.tsv'为表元数据代码>
3.现在,更改shell脚本的权限并执行它:
sudo chmod 777 script.sh
./script.sh