【问题标题】:How to create AWS Glue DynamicFrame from json with array of objects如何使用对象数组从 json 创建 AWS Glue DynamicFrame
【发布时间】:2020-10-14 21:44:25
【问题描述】:

我在 S3 中有 json 文件,每个文件中都包含对象数组,如下所示。

[{
    "id": "c147162a-a304-11ea-aa90-0242ac110028",
    "clientId": "xxx",
    "contextUUID": "1bb6b39e-b181-4a6d-b43b-4040f9d254b8",
    "tags": {},
    "timestamp": 1592855898
}, {
    "id": "c147162a-a304-11ea-aa90-0242ac110028",
    "clientId": "yyy",
    "contextUUID": "1bb6b39e-b181-4a6d-b43b-4040f9d254b8",
    "tags": {},
    "timestamp": 1592855898
}]

我使用爬虫来检测架构并将其加载到目录中。它成功了,它创建了一个模式,其中包含一个名为 array 的单列,数据类型为 array<struct<id:string,clientId:string,contextUUID:string,tags:string,timestamp:int>>

现在,我尝试使用glueContext.create_dynamic_frame.from_catalog 函数加载数据,但我看不到任何数据。我尝试打印模式和数据,如下所示。

ds = glueContext.create_dynamic_frame.from_catalog(
       database = "dbname",
       table_name = "tablename")

ds.printSchema()
root
ds.schema()
StructType([], {})
ds.show()
empty
ds.toDF().show()
++
||
++
++

任何想法,我做错了什么?我打算提取数组中的每个对象并将对象转换为不同的模式。

【问题讨论】:

  • 您能否确认您是否为角色定义了适当的 S3 权限,以便您的 Glue 作业从 S3 存储桶中读取此数据?
  • 是的,Glue 作业 IAM 角色具有适当的 S3 权限。
  • 好的。那么你可以在你的 Glue 作业中使用 boto3 做一个简单的 s3 对象列表/获取并确认相同吗? boto3.amazonaws.com/v1/documentation/api/latest/reference/…
  • 抱歉耽搁了,感谢您的反馈。我不得不将一些 jsonpath 属性修改为 $.[*] 以将数组中的每个元素评估为行。不记得是通过 UI 还是代码。当我有机会时,我会发布解决方案。再次感谢!
  • 嘿!我有同样的问题。有人有解决方案吗?权限看起来不错,因为 spark.read.json() 可以正常工作,它只是产生问题的 glue_context.create_dynamic_frame。

标签: python amazon-web-services apache-spark etl aws-glue


【解决方案1】:

您可以尝试在 format_options 中提供正则表达式来告诉胶水它应该如何读取数据。以下代码对我有用:

glueContext.create_dynamic_frame_from_options('s3', 
    {
        'paths': ["s3://glue-test-bucket-12345/events/101-1.json"]
    },
    format="json", 
    format_options={"jsonPath": "$[*]"}
    ).toDF()

希望能解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多