本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS Glue 資料目錄支援 Spark SQL 任務
AWS Glue Data Catalog 是 Apache Hive 中繼存放區相容的目錄。您可以設定您的 AWS Glue 任務和開發端點,使其使用 Data Catalog 作為外部 Apache Hive 中繼存放區。然後,您就可以直接對存放於 Data Catalog 的資料表執行 Apache Spark SQL 查詢。依預設,AWS Glue 動態框架會與 Data Catalog 進行整合。不過,搭配這項功能時,Spark SQL 任務就能使用 Data Catalog 做為外部 Hive 中繼存放區。
此功能需要網路存取 AWS Glue API 端點。適用於帶有私有子網路中連線的 AWS Glue 任務,您必須設定 VPC 端點或 NAT 閘道以提供網路存取。如需 VPC 端點組態的詳細資訊,請參閱 設定對資料存放區的網路存取。若要建立 NAT 閘道,請參閱 Amazon VPC 使用者指南中的 NAT 閘道。
您可以在任務引數和開發端點引數中分別新增 "--enable-glue-datacatalog": ""
引數,執行 AWS Glue 任務和開發端點的設定。透過這個引數傳遞,系統就會在 Spark 中設定特定的組態,進而可使用 Data Catalog 做為外部 Hive 中繼存放區。它也會在 AWS Glue 任務或開發端點中建立的 SparkSession
物件中啟用 Hive 支援
若要啟用 Data Catalog 存取權,請在主控台新增任務或新增端點頁面上的 Catalog 選項群組中,勾選使用 AWS Glue Data Catalog 做為 Hive 中繼存放區核取方塊。請注意,用於此任務或開發端點的 IAM 角色應該擁有 glue:CreateDatabase
許可。稱為 "default
" 的資料庫隨即在 Data Catalog 中建立 (如當時該資料庫尚未存在)。
讓我們從下面範例,了解您可以如何在 Spark SQL 任務中應用這項功能。下面範例是假設您已分類過下列網址提供的美國國會議員資料集,s3://awsglue-datasets/examples/us-legislators
。
為了要對 AWS Glue Data Catalog 中的定義資料表資料進行序列化/取消序列化,Spark SQL 必須具備 Hive SerDe
特定通用格式的 SerDes 則由 AWS Glue 發佈。下面是這類格式的 Amazon S3 連結:
將 JSON SerDe 當做 額外的 JAR 新增至開發端點。處理任務時,您可以在引數欄位中使用 --extra-jars
引數來新增 SerDe 。如需更多詳細資訊,請參閱 在 Glue AWS 任務中使用任務參數。
下面範例是輸入 JSON,建立啟用 Data Catalog 進行 Spark SQL 的開發端點。
{ "EndpointName": "Name", "RoleArn": "
role_ARN
", "PublicKey": "public_key_contents
", "NumberOfNodes": 2, "Arguments": { "--enable-glue-datacatalog": "" }, "ExtraJarsS3Path": "s3://crawler-public/json/serde/json-serde.jar" }
現在查詢使用 Spark SQL 建立自美國國會議員資料集的資料表。
>>> spark.sql("use legislators") DataFrame[] >>> spark.sql("show tables").show() +-----------+------------------+-----------+ | database| tableName|isTemporary| +-----------+------------------+-----------+ |legislators| areas_json| false| |legislators| countries_json| false| |legislators| events_json| false| |legislators| memberships_json| false| |legislators|organizations_json| false| |legislators| persons_json| false| +-----------+------------------+-----------+ >>> spark.sql("describe memberships_json").show() +--------------------+---------+-----------------+ | col_name|data_type| comment| +--------------------+---------+-----------------+ | area_id| string|from deserializer| | on_behalf_of_id| string|from deserializer| | organization_id| string|from deserializer| | role| string|from deserializer| | person_id| string|from deserializer| |legislative_perio...| string|from deserializer| | start_date| string|from deserializer| | end_date| string|from deserializer| +--------------------+---------+-----------------+
如果此格式的 SerDe 類別不能用於任務的類別路徑,則您會收到類似下列的錯誤訊息。
>>> spark.sql("describe memberships_json").show() Caused by: MetaException(message:java.lang.ClassNotFoundException Class org.openx.data.jsonserde.JsonSerDe not found) at org.apache.hadoop.hive.metastore.MetaStoreUtils.getDeserializer(MetaStoreUtils.java:399) at org.apache.hadoop.hive.ql.metadata.Table.getDeserializerFromMetaStore(Table.java:276) ... 64 more
若只要檢視源自 memberships
資料表的唯一 organization_id
,請執行下列 SQL 查詢。
>>> spark.sql("select distinct organization_id from memberships_json").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+
如果您需要搭配動態框架執行相同的作業,請執行下列步驟。
>>> memberships = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="memberships_json") >>> memberships.toDF().createOrReplaceTempView("memberships") >>> spark.sql("select distinct organization_id from memberships").show() +--------------------+ | organization_id| +--------------------+ |d56acebe-8fdc-47b...| |8fa6c3d2-71dc-478...| +--------------------+
雖然 DynamicFrames 已針對 ETL 操作經過最佳化處理,但在執行複雜 SQL 陳述式或轉運現有應用程式方面,啟用 Spark SQL 來直接存取 Data Catalog 卻是最簡潔的方法。