在 AWS EMR (5.33.1) 上使用 Hive 2.3.7 我创建了一个数据库,该数据库在调用
show databases;
时可以正确显示。然后我创建一个似乎可以正常工作的表(没有例外)。当我调用 describe <table>;
时,它会正确返回表的名称和架构。但是,当我运行 show tables;
时,会返回以下错误:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.MetaException(message:Got exception: org.apache.hadoop.hive.metastore.api.MetaException
Exception thrown when executing query :
SELECT A0.TBL_NAME,A0.TBL_NAME AS NUCORDER0 FROM TBLS A0 LEFT OUTER JOIN DBS B0 ON
A0.DB_ID = B0.DB_ID WHERE B0.`NAME` = ? AND LOWER(A0.TBL_NAME) LIKE '_%' ESCAPE '\' ORDER BY NUCORDER0)
如果有人能够阐明这个问题,我们将不胜感激。
我用谷歌搜索了一下,没有发现任何有用的东西。
编辑:
show tables in <schema>;
返回相同的结果
编辑 2:通过将 EMR 更新为
emr-6.4.0
解决了此问题。除了这里提到的内容之外,我对这个问题没有深入的了解。
我认为您的元数据数据库已损坏/包含错误数据。我会做一个备份。 然后看看是否可以恢复一些以前的备份。 我会直接连接到数据库并查看这些表,看看是否有任何异常。 如果您发现错误的表条目,请不要将其删除。 我会尝试使用“删除表”命令(通过配置单元)将其删除以保持完整性。 如果需要,您可以删除数据库中的条目,您有备份并且可以恢复表。
Hive 元存储使用 datanucleus,https://www.datanucleus.org/,用于元存储数据库的所有 CRUD。它生成
\\
来转义反斜杠本身,但 Mariadb 将 \\
解释为字符串文字。所以需要使用 \\
作为转义符。
您可以在此处查看 sql_mode 设置,https://mariadb.com/kb/en/sql-mode/#sql_mode-values。
从模式中去掉
NO_BACKSLASH_ESCAPE
就应该没问题了。
尝试提供您想要查看表格的架构:
show tables in schema_name;
jdbc:{{mariadburi}}?sessionVariables=sql_mode='ANSI,NO_ENGINE_SUBSTITUTION,NO_BACKSLASH_ESCAPES'
在您的
hive-site.xml
中,对于此键 javax.jdo.option.ConnectionURL
,设置上述值。
我们有各种可用的 sql 模式。需要设置这个sqlmodes,
sql_mode='ANSI,NO_ENGINE_SUBSTITUTION,NO_BACKSLASH_ESCAPES'
将
/
视为查询中的转义字符。