通过 Spark SQL 读取 Hive Table 的最佳方法是啥?
Posted
技术标签:
【中文标题】通过 Spark SQL 读取 Hive Table 的最佳方法是啥?【英文标题】:What is the best way to read Hive Table through Spark SQL?通过 Spark SQL 读取 Hive Table 的最佳方法是什么? 【发布时间】:2019-07-29 10:01:27 【问题描述】:我执行从 Hive 表读取的 Spark SQL,执行时间很长(15 分钟)。我对优化查询执行很感兴趣,所以我询问这些查询的执行是否使用 Hive 的执行引擎,通过这种方式,它类似于在 Hive 编辑器中执行查询,或者 Spark 仅使用 Hive Metastore 来了解文件的位置,然后直接处理之后的文件?
import os
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("yarn") \
.appName("src_count") \
.config('spark.executor.cores','5') \
.config('spark.executor.memory','29g') \
.config('spark.driver.memory','16g') \
.config('spark.driver.maxResultSize','12g')\
.config("spark.dynamicAllocation.enabled", "true")\
.config("spark.shuffle.service.enabled", "true")\
.getOrCreate()
sql = "SELECT S.SERVICE, \
COUNT(DISTINCT CONTRACT_KEY) DISTINCT_CNT, \
COUNT(*) CNT ... "
df.toPandas()
【问题讨论】:
为什么要将其转换为 pandas 数据框?有什么特殊需要吗? Spark sql 引擎通常使用 hive,即使您不直接使用 hive @vikrantrana 是聚合查询,返回的记录数量有限,少于 20 条记录。 @IlyaBrodezki 是否仅将其用作元存储并将其作为 RDD 或 DataFrames 执行,或者使用 Hive 服务器执行,就好像我在 Hive 编辑器中执行它一样?跨度> 您可以使用 spark 内置函数来提高性能。如果使用 spark 内置函数无法完成某些事情,请选择 pandas 或 python 函数。 【参考方案1】:您可以按如下方式读取 HIVE 表:
-
读取整个 HIVE 表
df = spark.table(
. )
-
可以基于SQL查询读取部分表。
df = spark.sql(
)
另外,在您的问题中,您正在尝试将 Spark DataFrame 转换为 Python DataFrame,这是不推荐的。因为,在这种情况下,您将所有数据从工作人员发送到驱动程序,这会通过网络传输大量数据并减慢应用程序的速度,而且您的驱动程序将过载,因为它将拥有整个数据集并且它也可能会进入 OOM。
【讨论】:
【参考方案2】:感谢大家的cmets :)
经过一些试验,我发现使用 spark.table 可以让我更好地控制编写冗长的 sql 语句,这有助于解决问题并优化其执行。
【讨论】:
以上是关于通过 Spark SQL 读取 Hive Table 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
通过 Spark SQL 读取 Hive Table 的最佳方法是啥?
源码级解读如何解决Spark-sql读取hive分区表执行效率低问题
[Spark][Hive][Python][SQL]Spark 读取Hive表的小例子