写shell脚本 从HDFS导数到Hive,报错如下:
mismatched input '<EOF>' expecting DATA near 'load' in load statement
shell代码如下:
#!/bin/bash do_date=$1 APP=gmall hive=/opt/module/hive/bin/hive sql=" load data inpath '/origin_data/$APP/db/user_info/$do_date' OVERWRITE into table $APP.ods_user_info partition(dt='$do_date'); " $hive -e $sql
出错的原因是最后一个$sql需要加双引号"",否则后面无法将$sql解析成的值(/origin_data/gmall/db/user_info/2019-12-08 OVERWRITE into table gmall.ods_user_info partition(dt='2019-12-08'))识别为字符串
改为$hive -e "$sql"。
注意shell中单引号和双引号的区别:!!!
单引号:输出时会将引号内的内容原样输出。
双引号:会先把变量、命令、转义字符解析出结果,即使双引号里有单引号引起来的变量,也会把变量解析成值,然后再输出最终内容。
例如:
#!/bin/bash do_date=$1 APP=gmall hive=/opt/module/hive/bin/hive
sql="load data inpath '/origin_data/$APP/db/user_info/$do_date' OVERWRITE into table $APP.ods_user_info partition(dt='$do_date');"
echo '/origin_data/$APP/db/user_info/$do_date' echo "$sql"
root@hadoop102 bin]# ods_order_info.sh 2019-12-08
输出结果:
/origin_data/$APP/db/user_info/$do_date load data inpath '/origin_data/gmall/db/user_info/2019-12-08' OVERWRITE into table gmall.ods_user_info partition(dt='2019-12-08');