首页 > 解决方案 > 用于将配置单元表加载到 Apache solr 的 Shell 脚本失败

问题描述

我正在编写一个 shell 脚本来将配置单元表中的数据加载到 Apache solr 模式中。

SRC=$1
    
TGT=$2
    
SOLR_COLLECTION=$3
    
SCHEMA=$(python schemaFetch.py ${SRC})
    
hive -e "ADD JAR /hadoopfs/fs1/dev/solr-hive-serde-3.0.0.jar;
    create external table if not exists ${TGT}${SCHEMA}
    row format delimited
    fields terminated by ','
    STORED BY 'com.lucidworks.hadoop.hive.LWStorageHandler'
    TBLPROPERTIES('solr.server.url' = 'http://10.165.137.139:8886/solr/',
    'solr.collection' = '${SOLR_COLLECTION}',
    'solr.query' = '*:*');"

hive -e "insert into ${TGT} select * from ${SRC};"

但它显示了一个运行时异常:

失败:RuntimeException org.apache.hadoop.hive.ql.metadata.HiveException:加载存储 handler.com.lucidworks.hadoop.hive.LWStorageHandler 时出错

然而,模式也在特定的配置单元位置创建,并且下面列出的插入到查询中的脚本无法正常工作。

hive -e "insert into ${TGT} select * from ${SRC};

我不明白发生了什么。

标签: pythonsolrhivesh

解决方案


该命令hive -e "insert into ${TGT} select * from ${SRC};缺少".

假设它应该是hive -e "insert into ${TGT} select * from ${SRC};",您可能会遇到 shell globbing 的问题:*被替换为您正在运行命令的文件夹的内容。

考虑以这种方式hive -e "insert into ${TGT} select * from ${SRC};"或通过这样做(使用bash语法)运行命令:

set -o noglob
hive -e "insert into ${TGT} select * from ${SRC};"
set +o noglob

第一个命令禁用通配,因此*不会被解释,而第三个命令恢复它。

您可以在脚本中使用类似的技术来确保*不会被不当解释。


推荐阅读