背景
最近做项目写了个导数的脚本,其实就是在一个集群的数据拉取下来到另外一个集群上并且建表(机器不通只能先这么干),然后将表中的数据用spark坐下整理放到整理目录下。
但是在建表的时候发生了些问题。
出现的问题
我的初衷是将建表语句在脚本中用如下表示
sql=
"
create table xxx (
xxx string
)
row foramte delilimited
...
"
这种形式,然后使用echo将变量输出重定向到当前目录的一个sql文件然后使用 hive -f 文件路径来建表
发现报错如下
(\n 'transient_lastDdlTime' = '1598093488'\n)\n': command not found
注意: sql中不能有反引号,不然会被linux 识别成命令。
反引号的定义:反引号在Linux shell命令行中有特殊的含义:反引号间的内容,会被shell先执行。其输出被放入主命令后,主命令再被执行。
解决
echo不适合做多行文本以及长文本的输出 涉及到多行文本(也支持变量替换)的情况 我们使用cat/EOF更合适
具体形式(自己写的demo)
cat >> create_table.sh << EOF
CREATE TABLE vbapfe4203ca074dad4e05551d39_parquet(column_0 BIGINT, column_1 STRING, column_2 BIGINT, column_3 BIGINT, column_4 STRING, column_5 STRING, column_6 STRING, column_7 BIGINT, column_8 BIGINT, column_9 BIGINT, column_10 BIGINT, column_11 BIGINT)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
)
STORED AS
INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
TBLPROPERTIES (
'transient_lastDdlTime' = '1598093488'
)
EOF
这样就可以吧多行的文本输出到当前目录的create_table.sh中了。
这里注意
1、EOF是“end of file”,表示文本结束符。 EOF只是标识,不是固定的 (换成别的字符是一样的)
2、cat >> create_table.sh << EOF 是表示将输出叠加到create_table.sh
cat > create_table.sh << EOF 是表示将输出覆盖到create_table.sh
网友评论