从 EMR pyspark 访问 Athena View,创建外部 table 或粘合目录,最有效的方式

Accessing Athena View from EMR pyspark, recreating external table or glue catalog, most effecient way

我已经阅读了其他问题,但我对该选项感到困惑。我想在 EMR spark 中读取 Athena view 并通过搜索 google/Whosebug,我意识到这些视图以某种方式存储在 S3 中,所以我首先尝试通过 [=23 找到视图的外部位置=]

Describe mydb.Myview

它提供架构但不提供外部位置。从中我假设我不能从 S3

读取它作为 Dataframe

到目前为止我在阅读 Spark 中的雅典娜视图时考虑了什么

我考虑过以下选项

  1. 使用外部格式为 PARQUET

    的 WITH 语句从此 athena VIEW 创建一个新的 table

    CREATE TABLE Temporary_tbl_from_view WITH ( format = 'PARQUET', external_location = 's3://my-bucket/views_to_parquet/', ) AS ( SELECT * FROM "mydb"."myview"; );

  1. 另一个选项基于,这表明

When you start an EMR cluster (v5.8.0 and later) you can instruct it to connect to your Glue Data Catalog. This is a checkbox in the 'create cluster' dialog. When you check this option your Spark SqlContext will connect to the Glue Data Catalog, and you'll be able to see the tables in Athena.

但我不确定如果 athena table/views 在 spark 上下文中通过 Glue catalogue 可用,我如何在 pyspark 中查询此 view(不是 table),将这样的简单语句行得通吗?

sqlContext.sql("SELECT * from mydbmyview")

问题,在 spark 中读取此视图的更有效方法是什么,使用 WITH 语句(外部位置)重新创建 table 是否意味着我正在存储这东西在Glue catalogS3 两次?如果是,如何直接通过S3或胶水目录读取?

为了与其他人分享我遵循的解决方案,我创建了启用以下选项的集群

Use AWS Glue Data Catalog for table metadata

之后,我从 AWS GLUE 中看到了 database 名称,并且能够在 tablename 中看到所需的视图,如下所示

spark.sql("use my_db_name")
spark.sql("show tables").show(truncate=False)
+------------+---------------------------+-----------+
|database    |tableName                  |isTemporary|
+------------+---------------------------+-----------+
|  my_db_name|tabel1                     |false      |
|  my_db_name|desired_table              |false      |
|  my_db_name|tabel3                     |false      |
+------------+---------------------------+-----------+