apachespark—读取pyspark中的大分区表会导致内存错误,即使在访问单个分区时也是如此

zpf6vheq  于 2021-06-25  发布在  Hive
关注(0)|答案(0)|浏览(176)

我有以下问题,我还没能解决。
我有一个非常大(几个tb和大约14.000个分区)的orc格式的hive分区表,我想通过PySparkSQLAPI访问它。我遇到的问题是,在运行查询时,即使spark.sql.hive.metastorepartitionprunning设置为true,也会查询所有分区。

from pyspark.sql import SparkSession

spark = (
    SparkSession
    .builder
    .appName("TestHiveIntegration")
    .enableHiveSupport()
    .getOrCreate()
)
spark.sql("""
    SELECT col
    FROM table
    WHERE partition_1 = 1
    AND partition_2 = 2
    LIMIT 1
""")

由于内存错误,这被java中断:

[Stage 0:===================================>              (7072 + 152) / 10000]#

# java.lang.OutOfMemoryError: Java heap space

# -XX:OnOutOfMemoryError="kill -9 %p"

# Executing /bin/sh -c "kill -9 9755"...

这不是分区规划问题,因为在读取表时,甚至在执行查询时,都会引发异常:

from pyspark.sql import SparkSession

spark = (
    SparkSession
    .builder
    .appName("TestHiveIntegration")
    .enableHiveSupport()
    .getOrCreate()
)
spark.read.table("table")  # This causes the same error

另外,当读取一个较小的表时,这不是问题,因为所有的分区都可以被浏览而没有问题。
有没有一种方法可以使用hive集成直接查询我想要的分区,而不必浏览所有可能的分区?
更新:
spark和hive版本是hive 2.3.6、spark 2.4.4。
表存储在s3上。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题