是否有一种编程方式来验证 HiveQL 语句是否存在诸如基本语法错误之类的错误?我想在将语句发送到 Elastic Map Reduce 之前对其进行检查,以节省调试时间。
3 回答
就在这里!
其实很容易。
脚步:
1. 使用您的语言获取 hive thrift 客户端。
我在 ruby 中,所以我使用这个包装器 - https://github.com/forward/rbhive(gem install rbhive)
如果您不在 ruby 中,您可以下载 hive 源代码并在包含的 thrift 配置文件上运行 thrift 以生成大多数语言的客户端代码。
2. 连接到端口 10001 上的 hive 并运行描述查询
在红宝石中,这看起来像这样:
RBHive.connect(host, port) do |connection|
connection.fetch("describe select * from categories limit 10")
end
如果查询无效,客户端将抛出异常,并详细说明语法无效的原因。如果语法有效,Describe 将返回一个查询树(在这种情况下您可以忽略)
希望有帮助。
“描述从类别限制 10 中选择 *”对我不起作用。
也许这与一个正在使用的 Hive 版本有关。我正在使用 Hive 0.8.1.4
在做了一些研究之后,我发现了一个与 Matthew Rathbone 提供的解决方案类似的解决方案:
Hive 提供了一个 EXPLAIN 命令,用于显示查询的执行计划。该语句的语法如下:
解释 [扩展] 查询
所以对于每个也在使用 rbhive 的人:
RBHive.connect(host, port) do |c|
c.execute("explain select * from categories limit 10")
end
请注意,您必须将 c.fetch 替换为 c.execute,因为如果成功,则 explain 不会返回任何结果 => rbhive 将抛出异常,无论您的语法是否正确。
如果您遇到语法错误或您正在查询的表/列不存在,execute 将引发异常。如果一切正常,不会抛出异常,但你也不会收到任何结果,这不是一件坏事
在最新版本的 hive 2.0 中带有 hplsql 工具,它允许我们验证 hive 命令而无需实际运行它们。
配置:在 hive/conf 文件夹中添加以下 XML 并重新启动 hive
https://github.com/apache/hive/blob/master/hplsql/src/main/resources/hplsql-site.xml
要运行 hplsql 并验证查询,请使用以下命令:验证单个查询
hplsql -offline -trace -e '从样本中选择 *'
(或)验证整个文件
hplsql -offline -trace -f samplehql.sql
如果查询语法正确,则来自 hplsql 的响应将是这样的:
Ln:1 SELECT // type
Ln:1 select * from sample // command
Ln:1 Not executed - offline mode set // execution status
如果查询语法错误,将报告查询中的语法问题
如果 hive 版本较旧,我们需要手动将 hplsql jar 放入 hive/lib 中并继续。