如何执行hql文件,每个文件有多个sql查询?

rxztt3cl  于 2021-06-01  发布在  Hadoop
关注(0)|答案(2)|浏览(444)

我有一个hql文件,它有很多配置单元查询,我想使用sparksql执行整个文件。
这就是我尝试过的。

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';

但我有成千上万的这样的台词。正确的方法是什么。
谁能帮忙解决这个问题。

ugmeyewa

ugmeyewa1#

嘿,你试过这个命令吗

spark-sql –master yarn-client –conf spark.ui.port=port -i /hadoop/sbscript/hql_for_dml.hql
xe55xuns

xe55xuns2#

热释光;医生,我觉得不可能。
spark sql使用astbuilder 作为 基于antlr的sql解析器,一次只接受一条sql语句(请参阅sqlbase.g4以获得所有支持的sql查询的完整覆盖范围)。
尽管如此,唯一的方法是在调用sparksql之前自己解析多查询输入文件 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查询适合sparksql,因此您应该有自己的解决方案。
我在一个项目中有一个类似的用例,在我把它交给spark之前,我就放弃了解析人们编写SQL的所有可能方法。

相关问题