我正在尝试将JSON文件压平,以便可以在AWS Glue中加载到PostgreSQL中。我使用PySpark进行操作。使用爬虫,我爬取S3 JSON并生成一个表。然后,我使用ETL Glue脚本来:
- 读取爬取的表
- 使用“ Relationalize”功能来压平文件
- 将动态框架转换为数据帧
- 尝试“ Explode”请求数据字段
到目前为止的脚本:
datasource0 = glueContext.create_dynamic_frame.from_catalog(database = glue_source_database, table_name = glue_source_table, transformation_ctx = "datasource0")
df0 = Relationalize.apply(frame = datasource0, staging_path = glue_temp_storage, name = dfc_root_table_name, transformation_ctx = "dfc")
df1 = df0.select(dfc_root_table_name)
df2 = df1.toDF()
df2 = df1.select(explode(col('`request.data`')).alias("request_data"))
<then i write df1 to a PostgreSQL database which works fine>
我面临的问题:
“关系化”函数很好用,但请求数据字段变成了bigint,因此“explode”无法使用。
由于数据结构的原因,不能在不先对JSON使用“关系化”函数的情况下执行“explode”。具体错误是:“org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析'explode(request.data
)':传递给函数explode的输入应该是数组或映射类型,而不是bigint”
如果我首先将动态框架转换为数据框,则会遇到以下问题:“py4j.protocol.Py4JJavaError:调用o72.jdbc时发生错误。:java.lang.IllegalArgumentException:无法获取struct的JDBC类型…”
我尝试上传分类器,以使数据在抓取过程中被平铺,但AWS证实这不起作用。
我正在尝试规范化的原始文件的JSON格式如下:
- field1
- field2
- {}
- field3
- {}
- field4
- field5
- []
- {}
- field6
- {}
- field7
- field8
- {}
- field9
- {}
- field10
for col in nested_df.columns:
需要被删除。 - Vinay Kolar