如何使用pyspark获取Delta表的所有当前分区?

问题描述

我正在使用 Delta Lake 的 OSS 版本和 spark 3.0.1。我当前的用例要求我发现给定增量表中的所有当前分区。

我的数据存储在 './data/raw' 中,并按列 sensorId 进行分区(提到的路径是我的 python 脚本的相对路径)。

我正在尝试使用 documentation 中提到的 SHOW PARTITIONS 语法。但是,我遇到了错误

这是我的代码的样子:

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("TestScript").getorCreate()
df=spark.sql("SHOW PARTITIONS delta.`./data/raw`")
df.show()

spark-submit 命令如下所示:

spark-submit --packages io.delta:delta-core_2.12:0.8.0 --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog" test_script.py

我收到以下错误

pyspark.sql.utils.AnalysisException: Database 'delta' not found;

我的另一个与此相关的问题是 SHOW PARTITIONS 是否会给我所有分区,或者它是否对结果设置了限制。如果有限制,发现/获取增量表的所有分区的最佳方法是什么。

解决方法

您可以通过多种方式查看分区。您提供的文档链接向您展示了执行此操作的方法。

  1. 如果您将数据保存为增量表,您可以通过提供表名而不是增量路径来获取分区信息,它会返回分区信息。

    spark.sql("SHOW Partitions schema.tableName").show()

  2. 您还可以使用该选项来指定表的物理文件所在的路径。在您的情况下,您正在根据您的 python 脚本所在的位置传递相对路径,但这不起作用。您需要传递 S3 存储桶或您使用的任何存储的确切路径以使其正常工作。

    spark.sql("SHOW Partitions delta.`dbfs:/mnt/S3/tables/data/raw`").show()

回答你的最后一个问题 Show partitions 是否会给你所有的分区。答案是肯定的,但如果您使用 df.show() 检查它是否只会显示前 20 行。

如果您想查看表的所有行/分区,您可以依靠数据帧,然后将其作为第二个参数传递给 show 方法。

val count = df.count()
df.show(count,truncate = False)