【发布时间】: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