【问题标题】:How to pass multiple statements into Spark SQL HiveContext如何将多个语句传递到 Spark SQL HiveContext
【发布时间】:2016-08-24 14:50:43
【问题描述】:

例如,我想传递给 Spark SQL 的 Hive HQL 语句很少:

set parquet.compression=SNAPPY;
create table MY_TABLE stored as parquet as select * from ANOTHER_TABLE;
select * from MY_TABLE limit 5;

以下不起作用:

hiveContext.sql("set parquet.compression=SNAPPY; create table MY_TABLE stored as parquet as select * from ANOTHER_TABLE; select * from MY_TABLE limit 5;")

如何将语句传递到 Spark SQL 中?

【问题讨论】:

  • 就像您在 Java(或任何其他使用数据库驱动程序的语言)中所做的那样:按顺序执行 each 语句。这就是 Hive CLI 所做的,实际上,将其输入解析为单独的 HQL 语句——加上一些变量替换和类似的东西。
  • @SamsonScharfrichter 谢谢。我认为这是可以接受的答案。

标签: apache-spark hiveql spark-dataframe


【解决方案1】:

我在一个场景中工作,我需要读取一个 sql 文件并运行所有的;该文件中存在单独的查询。

一个简单的方法是这样的:

val hsc = new org.apache.spark.sql.hive.HiveContext(sc)
val sql_file = "/hdfs/path/to/file.sql"
val file = sc.wholeTextFiles(s"$sql_file")
val queries = f.take(1)(0)._2
Predef.refArrayOps(queries.split(';')).map(query => hsc.sql(query))

【讨论】:

【解决方案2】:

感谢@SamsonScharfrichter 的回答。

这将起作用:

hiveContext.sql("set spark.sql.parquet.compression.codec=SNAPPY")
hiveContext.sql("create table MY_TABLE stored as parquet as select * from ANOTHER_TABLE")
val rs = hiveContext.sql("select * from MY_TABLE limit 5")

请注意,在这种特殊情况下,我们需要使用 spark.sql.parquet.compression.codec

而不是 parquet.compression

【讨论】:

  • 这是 Spark SQL 解析器的错误吗?因为 Hive 已经可以做到这一点。
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2011-08-07
  • 2016-09-08
  • 1970-01-01
  • 2021-02-06
相关资源
最近更新 更多