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

ej83mcc0  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(419)

我想创建一个脚本加载到配置单元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抱怨 > 这将导致重定向到新脚本失败,因此脚本失败。
我怎样才能解决这个问题?

kpbwa7wx

kpbwa7wx1#

1创建一个名为 script.sh 并在shell脚本中添加以下内容:


# !/bin/sh

tail -n +2 metadata.tsv > tmp_metadata.tsv
hive -v -f ./script.hql

2而不是你的 script.hql :
删除表元数据(如果存在);
创建表元数据(id int,value string)行格式分隔字段,以存储为textfile的'\t'结尾;
! tail-n+2 metadata.tsv>tmp\u metadata.tsv;
将数据本地“tmp\u metadata.tsv”加载到元数据中;
将此添加到您的 script.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 metadata IF EXISTS ;` 不正确。把它改成 `DROP TABLE IF EXISTS metadata;` 和 `LOAD DATA LOCAL 'tmp_metadata.tsv' INTO metadata ;` 不正确。把它改成 `LOAD DATA LOCAL INPATH 'tmp_metadata.tsv' INTO TABLE metadata ;` 三。现在,更改shell脚本的权限并执行它:

sudo chmod 777 script.sh
./script.sh

相关问题