我正在尝试展平 JSON 文件,以便能够将其全部加载到 AWS Glue 中的 PostgreSQL 中。我正在使用 PySpark。我使用爬虫抓取 S3 JSON 并生成一个表。然后我使用 ETL Glue 脚本来:
- 读取爬取的表
- 使用“Relationalize”功能压平文件
- 将动态帧转换为数据帧
- 尝试“分解” request.data 字段
到目前为止的脚本:
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>
我面临的问题:
“Relationalize”函数运行良好,但 request.data 字段变为 bigint,因此“explode”不起作用。
由于数据的结构,如果不首先在 JSON 上使用“Relationalize”,就无法完成爆炸。具体错误是:“org.apache.spark.sql.AnalysisException:无法解析'explode(request.data
)' 由于数据类型不匹配:函数explode的输入应该是数组或映射类型,而不是bigint”
如果我尝试首先将动态帧设为数据帧,则会出现以下问题:“py4j.protocol.Py4JJavaError:调用 o72.jdbc 时发生错误。
:java.lang.IllegalArgumentException:无法获取结构的 JDBC 类型...”
我还尝试上传一个分类器,以便数据在爬行本身中变平,但 AWS 确认这行不通。
原始文件的 JSON 格式如下,我试图对其进行标准化:
- field1
- field2
- {}
- field3
- {}
- field4
- field5
- []
- {}
- field6
- {}
- field7
- field8
- {}
- field9
- {}
- field10