通过 Spark SQL 读取 Hive Table 的最佳方式是什么?

What is the best way to read Hive Table through Spark SQL?

我执行 Spark SQL 从 Hive 表中读取,执行时间很长(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()

您可以阅读 HIVE table 如下:

  1. 阅读整个 HIVE Table

df = spark.table(<HIVE_DB>.<HIVE_TBL>)

  1. 您可以阅读部分 table 基于 SQL 查询。

df = spark.sql(<YOUR_SQL_Query>)

此外,在您的问题中,您试图将 Spark DataFrame 转换为 Python DataFrame,这是不推荐的。因为,在这种情况下,您将所有数据从 worker 发送到驱动程序,这会在网络上传输大量数据并减慢应用程序速度,而且您的驱动程序将超载,因为它将拥有整个数据集并且它也可能会进入 OOM。

感谢大家的评论:)

经过一些试验,我发现使用 spark.table 可以让我更好地控制编写冗长的 sql 语句,这有助于排除故障并优化其执行ץ