Hive 验证配置单元HQL语法?

Hive 验证配置单元HQL语法?,hive,amazon-emr,Hive,Amazon Emr,是否有一种编程方式来验证HiveQL语句是否存在诸如基本语法错误之类的错误?为了节省调试时间,我希望在将语句发送到Elastic Map Reduce之前检查它们 是的,有 其实很简单 步骤: 1。用您的语言获取hive thrift客户。 我使用ruby,所以我使用这个包装器-(gem安装rbhive) 如果您不使用ruby,您可以下载配置单元源代码并在包含的thrift配置文件上运行thrift,以生成大多数语言的客户机代码 2。连接到端口10001上的配置单元并运行描述查询 在ruby中,

是否有一种编程方式来验证HiveQL语句是否存在诸如基本语法错误之类的错误?为了节省调试时间,我希望在将语句发送到Elastic Map Reduce之前检查它们

是的,有

其实很简单

步骤:

1。用您的语言获取hive thrift客户。

我使用ruby,所以我使用这个包装器-(gem安装rbhive)

如果您不使用ruby,您可以下载配置单元源代码并在包含的thrift配置文件上运行thrift,以生成大多数语言的客户机代码

2。连接到端口10001上的配置单元并运行描述查询

在ruby中,如下所示:

RBHive.connect(host, port) do |connection|
    connection.fetch("describe select * from categories limit 10")
end
Ln:1 SELECT // type
Ln:1 select * from sample // command
Ln:1 Not executed - offline mode set // execution status
如果查询无效,客户端将抛出异常,并详细说明语法无效的原因。如果语法有效,descripe将返回一个查询树(在本例中可以忽略)

希望能有所帮助。

“描述从类别中选择*限制10”对我不起作用

也许这与我们正在使用的配置单元版本有关。 我正在使用Hive0.8.1.4

在做了一些研究之后,我发现了一个类似于Matthew Rathbone提供的解决方案:

配置单元提供一个EXPLAIN命令,显示查询的执行计划。此语句的语法如下所示:

解释[扩展]查询

因此,对于同样使用rbhive的所有人:

RBHive.connect(host, port) do |c|
    c.execute("explain select * from categories limit 10")
end
请注意,您必须用c.execute替换c.fetch,因为explain如果成功将不会返回任何结果=>rbhive将抛出异常,无论您的语法是否正确。


如果出现语法错误或正在查询的表/列不存在,execute将引发异常。如果一切正常,则不会引发异常,但也不会收到任何结果,这并非坏事

在最新版本中,hive 2.0附带了hplsql工具,它允许我们验证hive命令,而无需实际运行它们

配置: 在配置单元/conf文件夹中添加以下XML并重新启动配置单元

要运行hplsql并验证查询,请使用以下命令: 验证单个查询的步骤

hplsql-脱机-跟踪-e“从样本中选择*

(或) 验证整个文件的步骤

hplsql-offline-trace-f samplehql.sql

如果查询语法正确,则来自hplsql的响应如下:

RBHive.connect(host, port) do |connection|
    connection.fetch("describe select * from categories limit 10")
end
Ln:1 SELECT // type
Ln:1 select * from sample // command
Ln:1 Not executed - offline mode set // execution status
如果查询语法错误,将报告查询中的语法问题


如果配置单元版本较旧,我们需要手动将hplsql JAR放置在配置单元/lib中并继续操作。

这实际上是完全不明显的事情,但一旦解决了它,就非常有用。我有9个月没想过这样做!真的很聪明。我们肯定会在我们的内部平台上使用它。谢谢你的回答!