使用符号链接格式清单对 Delta Lake 表进行 Spark SQL 查询

Spark SQL queries against Delta Lake Tables using Symlink Format Manifest

我 运行ning spark 3.1.1 和 AWS emr-6.3.0 集群具有以下 hive/metastore 配置:

spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog
spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore
spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension
hive.metastore.client.factory.class=com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory

我在 AWS Glue 中定义了一个 Delta Lake table,它指向一个 s3 位置,特别是一个符号链接清单文件(用于 Redshift Spectrum 集成):

location=s3://<bucket>/<database>/<table>/_symlink_format_manifest

当我 运行 spark spark sql 查询(来自 spark 应用程序或 spark-shell)时 table(即“select * 来自 database.table 限制 10"),我得到以下异常:

Caused by: java.lang.RuntimeException: s3://<bucket?/<database>/<table>/_symlink_format_manifest/manifest is not a Parquet file. expected magic number at tail [80, 65, 82, 49] but found [117, 101, 116, 10]

spark SQL / hive 似乎未设置为读取 Glue 中定义的外部 table table 指向的清单文件以启用 redshift 集成。我想知道是否有其他人遇到/解决了这个问题,是否有办法配置 spark 或 hive 以正确读取 Delta Lake 实木复合地板文件,而无需更改 Glue 中的外部 table 定义(指向清单).

最后我自己解决了这个问题。

通过掌握查询外部 delta lake table(通过胶水)和直接查询 delta lake table 之间的区别,您可以避免很多痛苦和误解,请参阅: https://docs.delta.io/latest/delta-batch.html#read-a-table

为了直接查询 delta lake table 而无需交互或通过外部 table,只需更改 spark table 中的引用 sql查询格式如下:

delta.`<table-path>`

例如,

spark.sql("""select * from delta.`s3://<bucket>/<key>/<table-name>/` limit 10""")