我有一个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';
但我有成千上万的这样的台词。正确的方法是什么。
谁能帮忙解决这个问题。
2条答案
按热度按时间ugmeyewa1#
嘿,你试过这个命令吗
xe55xuns2#
热释光;医生,我觉得不可能。
spark sql使用astbuilder 作为 基于antlr的sql解析器,一次只接受一条sql语句(请参阅sqlbase.g4以获得所有支持的sql查询的完整覆盖范围)。
尽管如此,唯一的方法是在调用sparksql之前自己解析多查询输入文件
sqlContext.sql
(或spark.sql
从spark 2.0开始)。您可以使用空行作为分隔符,但这取决于输入文件的结构(它们可以轻松地使用分号)。
在你的特殊情况下,我注意到结尾标记实际上是分号。
如果这是一致的,您可以逐行解析文件(就像您对
for
(表情)读到;
找到了。多行sql查询适合sparksql,因此您应该有自己的解决方案。我在一个项目中有一个类似的用例,在我把它交给spark之前,我就放弃了解析人们编写SQL的所有可能方法。