gpt4 book ai didi

scala - 如何在单个文件中执行多个 SQL 查询的 hql 文件?

转载 作者:可可西里 更新时间:2023-11-01 14:30:17 26 4
gpt4 key购买 nike

我有一个 hql 文件,其中有很多配置单元查询,我想使用 Spark SQL 执行整个文件。

这是我试过的。

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 

通常我们以这种方式执行单个查询:

sqlContext.sql("SELECT * from table")

但是,当我们有包含数百个查询的 hql 文件时,我通常会这样做。

import scala.io.Source 

val filename = "/path/to/file/filename.hql"
for (line <- Source.fromFile(filename).getLines) {
sqlContext.sql(line)
}

但是,我收到一条错误消息:

NoViableAltException

这是文件的顶部。

DROP TABLE dat_app_12.12_app_htf;

CREATE EXTERNAL TABLE dat_app_12.12_app_htf(stc string,
ftg string,
product_type string,
prod_number string,
prod_ident_number string,
prod_family string,
frst_reg_date date, gth_name string,
address string,
tel string,
maker_name string) ROW format serde 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
stored AS inputformat 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'file_location';

当查询是像上面这样的多行查询时,它不起作用。但是,当我格式化查询并将所有行放在一行中时,它就可以工作了。

CREATE EXTERNAL TABLE dat_app_12.12_app_htf(stc string, ftg string, product_type string, prod_number string, prod_ident_number string, prod_family string, frst_reg_date date, gth_name string, address string, tel string, maker_name string) ROW format serde 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' stored AS inputformat 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' LOCATION 'file_location';

但我有数千行这样的代码。正确的做法是什么。

任何人都可以帮助解决这个问题。

最佳答案

tl;dr 我不认为这是可能的。

Spark SQL 使用 AstBuilder作为基于⟩ANTLR 的 SQL 解析器,一次接受单个 SQL 语句(有关所有支持的 SQL 查询的完整信息,请参阅 SqlBase.g4)。

话虽如此,唯一的方法是在 调用 Spark SQL 的 sqlContext.sql(或 spark .sql 从 Spark 2.0 开始。

您也许可以依赖空行作为分隔符,但这取决于输入文件的结构(并且它们可以轻松地使用分号代替)。


在您的特定情况下,我注意到结束标记实际上是分号。

// one query that ends with semicolon
DROP TABLE dat_app_12.12_app_htf;

// another query that also ends with semicolon
CREATE EXTERNAL TABLE dat_app_12.12_app_htf(stc string,
ftg string,
product_type string,
prod_number string,
prod_ident_number string,
prod_family string,
frst_reg_date date, gth_name string,
address string,
tel string,
maker_name string) ROW format serde 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
stored AS inputformat 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
outputformat 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'file_location';

如果一致,您可以逐行解析文件(就像使用 for 表达式一样)并阅读直到找到 ;。多行 SQL 查询适用于 Spark SQL,因此您应该有自己的解决方案。


我在一个项目中有一个类似的用例,在我将它交给 Spark 之前,我只是放弃了尝试解析人们编写 SQL 的所有可能方式。

关于scala - 如何在单个文件中执行多个 SQL 查询的 hql 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47567440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com