通过 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 如下:
- 阅读整个 HIVE Table
df = spark.table(<HIVE_DB>.<HIVE_TBL>)
- 您可以阅读部分 table 基于 SQL 查询。
df = spark.sql(<YOUR_SQL_Query>)
此外,在您的问题中,您试图将 Spark DataFrame 转换为 Python DataFrame,这是不推荐的。因为,在这种情况下,您将所有数据从 worker 发送到驱动程序,这会在网络上传输大量数据并减慢应用程序速度,而且您的驱动程序将超载,因为它将拥有整个数据集并且它也可能会进入 OOM。
感谢大家的评论:)
经过一些试验,我发现使用 spark.table 可以让我更好地控制编写冗长的 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 如下:
- 阅读整个 HIVE Table
df = spark.table(<HIVE_DB>.<HIVE_TBL>)
- 您可以阅读部分 table 基于 SQL 查询。
df = spark.sql(<YOUR_SQL_Query>)
此外,在您的问题中,您试图将 Spark DataFrame 转换为 Python DataFrame,这是不推荐的。因为,在这种情况下,您将所有数据从 worker 发送到驱动程序,这会在网络上传输大量数据并减慢应用程序速度,而且您的驱动程序将超载,因为它将拥有整个数据集并且它也可能会进入 OOM。
感谢大家的评论:)
经过一些试验,我发现使用 spark.table 可以让我更好地控制编写冗长的 sql 语句,这有助于排除故障并优化其执行ץ