【发布时间】:2019-10-04 15:51:11
【问题描述】:
我正在尝试将 JSON 文件展平,以便能够将其全部加载到 AWS Glue 中的 PostgreSQL 中。我正在使用 PySpark。我使用爬虫爬取 S3 JSON 并生成一个表。然后我使用 ETL Glue 脚本:
- 读取爬取的表格
- 使用“关系化”函数来展平文件
- 将动态帧转换为数据帧
- 尝试“分解” 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 上使用“关系化”,就无法进行分解。具体错误是:“org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解析'explode(request.data)':函数explode的输入应该是数组或映射类型,而不是bigint”
如果我尝试先将动态帧设为数据帧,则会出现以下问题:“py4j.protocol.Py4JJavaError:调用 o72.jdbc 时发生错误。 : java.lang.IllegalArgumentException: Can't get JDBC type for struct..."
我还尝试上传一个分类器,以便数据在爬网过程中变平,但 AWS 确认这不起作用。
原始文件的 JSON 格式如下,我正在尝试规范化:
- field1
- field2
- {}
- field3
- {}
- field4
- field5
- []
- {}
- field6
- {}
- field7
- field8
- {}
- field9
- {}
- field10
【问题讨论】:
标签: arrays json pyspark pyspark-sql aws-glue