1

サンプル: Glue カタログに以下の DDL を含むパーティション テーブルがあります。

CREATE EXTERNAL TABLE `test`(
  `id` int, 
  `data` struct<a:string,b:string>)
PARTITIONED BY ( 
  `partition_0` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 

S3 の基礎となるデータは、さまざまなスキーマを持つ json ファイルです。これは、一部の要素が一部のファイルに存在せず、他のファイルに存在する可能性があることを意味します。

このサンプルの partition_0='01' には、すべての要素を含む json ファイルが含まれています。

{"id": 1,"data": {"a": "value-a", "b": "value-b"}}

partition_0='02' のファイルには要素データが含まれていません。b:

{"id": 1,"data": {"a": "value-a"}}

問題: Glue (私は Python を使用) で DynamicFrame を作成すると、そのスキーマはクエリするデータに依存します。partition_0='01' からのデータを含めると、すべての要素がスキーマに存在します。

id_partition_predicate="partition_0 = '01'"
print("partition with 'b'")
glueContext.create_dynamic_frame.from_catalog(database = glue_source_database, table_name = "test", push_down_predicate = id_partition_predicate).printSchema()

partition with 'b'
root
|-- id: int
|-- data: struct
|    |-- a: string
|    |-- b: string
|-- partition_0: string
print("both partitions")
glueContext.create_dynamic_frame.from_catalog(database = glue_source_database, table_name = "test").printSchema()

both partitions
root
|-- id: int
|-- data: struct
|    |-- a: string
|    |-- b: string
|-- partition_0: string

partition_0='02' からのデータのみをクエリすると、要素 data.b は、テーブル定義に存在するにもかかわらず、DynamicFrame スキーマに存在しません。

print("partition without 'b'")
id_partition_predicate="partition_0 = '02'"
glueContext.create_dynamic_frame.from_catalog(database = glue_source_database, table_name = "test", push_down_predicate = id_partition_predicate).printSchema()


partition without 'b'
root
|-- id: int
|-- data: struct
|    |-- a: string
|-- partition_0: string

質問: Glue テーブルのスキーマのすべての要素を常に含む DynamicFrame または DataFrame を作成するにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1