了解如何在 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 UI
http://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
/数据文件(例如JSON
、Parquet
)构造一个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 - 它们如何相互协作?