通过 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如何从jdbc读取数据?

[Spark][Hive][Python][SQL]Spark 读取Hive表的小例子

Spark-sql读取hive分区表限制分区过滤条件及限制分区数量

使用 hive/sql 和 spark 读取 json 键值