pyspark AWS Glue -为具有混合类型列的Dynamo DB表创建动态框架

4urapxun  于 2023-11-16  发布在  Spark
关注(0)|答案(2)|浏览(171)

DynamoDB表:

  1. +------------------+---------+---------------------+
  2. | id |Column A | Column B|
  3. +------------------+---------+---------------------+
  4. |1 | "155.2"| 400 |
  5. |2 | 100| 200 |
  6. |3 | "455.2"| 305.5 |
  7. |4 | "312.3"| 350 |
  8. +------------------+---------+---------------------+

字符串
注意,在A列中,除了id = 2之外,我们将数字存储为字符串。
以下代码用于将表内容读入动态帧:

  1. def create_dynamic_frame(table_name):
  2. ddb_s3_bucket = <some-s3-bucket>
  3. ddb_table_arn = <some-table-arn>
  4. connection_options = {
  5. "dynamodb.export": "ddb",
  6. "dynamodb.unnestDDBJson": True,
  7. "dynamodb.tableArn": ddb_table_arn,
  8. "dynamodb.s3.bucket": ddb_s3_bucket,
  9. "dynamodb.s3.prefix": 'temporary/ddbexport/'
  10. }
  11. dynamic_frame = glueContext.create_dynamic_frame.from_options(
  12. connection_type="dynamodb",
  13. connection_options=connection_options,
  14. transformation_ctx="dynamic_frame",
  15. )
  16. return dynamic_frame
  17. dyf = create_dynamic_frame('test-table')


在创建的动态帧上显示的输出:dyf.toDf().show()

  1. +------------------+---------+---------------------+
  2. | id |Column A | Column B|
  3. +------------------+---------+---------------------+
  4. |1 | null| 400 |
  5. |2 | 100 | 200 |
  6. |3 | null| 305.5 |
  7. |4 | null| 350 |
  8. +------------------+---------+---------------------+


dyf.toDf().printSchema()的输出:

  1. root
  2. |-- id: string (nullable = true)
  3. |-- Column A: string (nullable = true)
  4. |-- Column B: string (nullable = true)


注意,A列中的字符串值是null。我的印象是,Glue将这两种类型都保留在列中,然后您可以使用resolveChoice转换为您想要的任何类型。
有没有一种方法可以解析GST-DDB连接器中的类型?
我尝试使用resolveChoice解析类型:

  1. resolved_dyf = dyf.resolveChoice(specs = [("Column A", "cast:string")])


这不起作用,因为dyf本身的值是null

bprjcwpo

bprjcwpo1#

当使用“unnestDDBJson”时,它被迫解析和扁平化模式,我认为你需要在你的情况下避免这种情况,并在解析类型后自己做。

8qgya5xd

8qgya5xd2#

这似乎是“connectionType”:“dynamodb”的一个限制,其中AWS Glue DynamoDB导出连接器作为源
此外,如果我们使用unnestDDBJson参数,Glue被迫评估列的模式。如果我不使用unnestDDBJson参数,所有列值都保持为struct,我找不到资源来解析类型。
一种解决方法是使用“connectionType”:“dynamodb”和ETL连接器作为源

相关问题