Я хочу считывать данные из таблиц AWS Data Catalog (Iceberg и Non-Iceberg) из кода pyspark в локальной среде. Я соответствующим образом настроил SparkSession. Хотя я могу получить доступ к таблицам Iceberg локально, таблицы Non-Iceberg не отображаются.
spark = SparkSession.builder.config("spark.hadoop.fs.s3a.access.key", os.getenv('AWS_ACCESS_KEY_ID')) \
.config("spark.hadoop.fs.s3a.secret.key", os.getenv('AWS_SECRET_ACCESS_KEY')) \
.config("spark.hadoop.fs.s3a.session.token", os.getenv('AWS_SESSION_TOKEN')) \
.config("spark.hadoop.fs.s3a.endpoint", f"s3.{os.getenv('AWS_REGION')}.amazonaws.com") \
.config("spark.hadoop.fs.s3a.region", os.getenv('AWS_REGION')) \
.config("spark.jars.packages", "org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.0,org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.11.874,software.amazon.awssdk:bundle:2.27.2,software.amazon.awssdk:metrics-spi:2.27.2,software.amazon.awssdk:s3:2.27.2,software.amazon.awssdk:glue:2.27.2") \
.config('spark.sql.catalog.glue_catalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.glue_catalog.catalog-impl', 'org.apache.iceberg.aws.glue.GlueCatalog') \
.config('spark.sql.iceberg.handle-timestamp-without-timezone', 'true') \
.config('spark.sql.catalog.glue_catalog.warehouse', 's3://glue/datalake/') \
.config('spark.sql.extensions','org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions')\
.config('spark.sql.catalog.glue_catalog.io-impl', 'org.apache.iceberg.aws.s3.S3FileIO') \
.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
.config("spark.hadoop.fs.defaultFS", "s3://glue") \
.enableHiveSupport() \
.getOrCreate()
Для таблиц Non-Iceberg я получаю следующую ошибку: [TABLE_OR_VIEW_NOT_FOUND].
Если вы могли бы уделить этому внимание и помочь решить проблему.
Я надеюсь иметь возможность получить доступ как к таблицам Iceberg, так и к таблицам Non-Iceberg с использованием одной и той же сессии Spark в моей локальной среде.
Ответ
Для доступа к таблицам AWS Data Catalog (как Iceberg, так и не Iceberg) из локальной сессии PySpark, нужно убедиться, что конфигурация SparkSession правильно настроена для работы с Glue Catalog. Ваш код выглядит хорошо, но есть несколько моментов, которые стоит учесть, чтобы устранить ошибку [TABLE_OR_VIEW_NOT_FOUND]
для не Iceberg таблиц.
Проверка конфигурации
-
Убедитесь, что вы используете правильный Data Catalog: Для доступа к не Iceberg таблицам вам, возможно, потребуется отдельно настроить HiveCatalog или GlueCatalog.
-
Используйте правильный формат таблиц: Проверьте, что таблицы в Glue Catalog действительно существуют и являются структурированными данными, доступными для Spark.
- Проверьте доступ к Glue: Убедитесь, что у вашего пользователя или роли есть необходимые разрешения для доступа к Glue Catalog, включая
glue:GetTable
иglue:GetTables
.
Пример исправленного SparkSession
Попробуйте изменить конфигурацию вашего SparkSession следующим образом:
from pyspark.sql import SparkSession
import os
spark = SparkSession.builder \
.config("spark.hadoop.fs.s3a.access.key", os.getenv('AWS_ACCESS_KEY_ID')) \
.config("spark.hadoop.fs.s3a.secret.key", os.getenv('AWS_SECRET_ACCESS_KEY')) \
.config("spark.hadoop.fs.s3a.session.token", os.getenv('AWS_SESSION_TOKEN')) \
.config("spark.hadoop.fs.s3a.endpoint", f"s3.{os.getenv('AWS_REGION')}.amazonaws.com") \
.config("spark.hadoop.fs.s3a.region", os.getenv('AWS_REGION')) \
.config("spark.jars.packages",
"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.0,"
"org.apache.hadoop:hadoop-aws:3.3.4,"
"com.amazonaws:aws-java-sdk-bundle:1.11.874,"
"software.amazon.awssdk:bundle:2.27.2") \
.config("spark.sql.catalog.glue", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config("spark.sql.catalog.glue.warehouse", "s3://glue/datalake/") \
.config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
.config("spark.hadoop.fs.defaultFS", "s3://glue") \
.enableHiveSupport() \
.getOrCreate()
Доступ к Non-Iceberg таблицам
Теперь, чтобы прочитать не Iceberg таблицы, используйте:
df_non_iceberg = spark.sql("SELECT * FROM glue.default.your_non_iceberg_table_name")
df_non_iceberg.show()
Дополнительные шаги
-
Проверка имен таблиц: Убедитесь, что имя таблицы указано правильно, включая правильный префикс схемы (например,
glue.default
). -
Логи и отладка: Изучите логи Spark для получения дополнительных подсказок о том, что может быть не так.
- Убедитесь, что сессия активна и данные доступны: Иногда проблемы могут быть связаны с контекстом сессии или доступом к данным. Попробуйте перезапустить сеанс.
Заключение
Следуя вышеуказанным рекомендациям и корректируя конфигурацию SparkSession, вы должны иметь возможность получить доступ к как Iceberg, так и не Iceberg таблицам из AWS Data Catalog. Убедитесь, что все разрешения и конфигурации установлены правильно для избежания ошибок.