了解如何在 Spark 中执行 Hive SQL

Posted

技术标签:

【中文标题】了解如何在 Spark 中执行 Hive SQL【英文标题】:Understanding how Hive SQL gets executed in Spark 【发布时间】:2018-05-07 08:57:46 【问题描述】:

我是 spark 和 hive 的新手。我需要了解在 Spark 中查询配置单元表时会发生什么。我正在使用 PySpark

例如:

warehouse_location = '\user\hive\warehouse'
from pyspark.sql import SparkSession
spark =SparkSession.builder.appName("Pyspark").config("spark.sql.warehouse.dir", warehouse_location).enableHiveSupport().getOrCreate()

DF = spark.sql("select * from hive_table")

上述情况下,实际的SQL是运行在spark框架中还是运行在Hive的MapReduce框架中。

我只是想知道如何处理 SQL。无论是在 Hive 还是 Spark 中?

【问题讨论】:

当 Hive 查询应用于数据帧时,它会在处理之前转换为 SparkSQL 【参考方案1】:

enableHiveSupport()HiveContext 非常具有误导性,因为它们暗示了与 Hive 的更深层次的关系。

实际上,Hive 支持意味着 Spark 将使用 Hive 元存储来读取和写入元数据。在 2.0 之前有 some additional benefits (窗口函数支持,更好的解析器),但今天不再是这种情况。

Hive 支持暗示:

完整的 Hive 查询语言兼容性。 在 Hive 上进行任何形式的计算。

【讨论】:

谢谢,但我的问题是如何处理 SQL 查询。它在 Spark 或 Hive(MapReduce) 框架中? 查询执行(select * from )是否发生在 Spark 上? spark会直接从文件系统中读取底层表文件吗? 数据由 Spark 处理。不涉及 Hive / MapReduce。【参考方案2】:

SparkSQL 允许在Hive 表中读取和写入数据。除了Hive 数据之外,任何RDD 都可以转换为DataFrame,并且SparkSQL 可以用于对DataFrame 运行查询。

实际执行将发生在Spark。您可以通过运行DF.count() 在您的示例中检查这一点,并通过Spark UIhttp://localhost:4040 跟踪作业。

【讨论】:

谢谢。你是说虽然它使用 Hive 表,但查询执行(select * from)发生在 Spark。意思是spark会直接从文件系统中读取底层表文件? 是的,正确的。 SparkSQL 将利用 Hive 元存储来访问 Hive 表的元数据。然后,从磁盘读取表文件,处理它们并运行查询的工作都是通过Spark引擎完成的。 感谢您的解释。一般来说,SparkSQL 是指在 Spark 中执行上述示例中的 SQL 查询吗? SparkSQL 允许通过spark.sql("query") 对现有Hive 表执行SQL 查询。这很棒,因为您可以提高性能,同时在现有的 Hadoop 集群中使用 Hive 设置。 SparkSQL 也可以通过DataSet API 使用。在这里,您从现有的RDD/数据文件(例如JSONParquet)构造一个Dataset/DataFrame,然后在其上使用filter()groupBy()map() 之类的转换。 DataFrame 提供数据的表格视图,并且由于它具有与之关联的架构,SparkSQL 可以比普通的 RDD 更有效地处理它。

以上是关于了解如何在 Spark 中执行 Hive SQL的主要内容,如果未能解决你的问题,请参考以下文章

可以在没有运行任何 Map/Reduce (/Yarn) 的情况下对 Hive 表执行 Spark SQL 吗?

Spark-Sql整合hive,在spark-sql命令和spark-shell命令下执行sql命令和整合调用hive

Hive with Hadoop vs Hive with spark vs spark sql vs HDFS - 它们如何相互协作?

Spark SQL与Hive的关系

Apache Spark:我如何理解和控制我的查询是在 Hive 引擎还是 Spark 引擎上执行的?

Hive on Spark