Hadoop 使用stdout重定向创建要加载到配置单元表中的临时文件

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

我想创建一个脚本,将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 +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