4

我正在从 s3 数据湖中抓取 JSON 文件(它是一个有效的 JSON)。里面有 2 个字段(设备、时间戳)和一个称为“数据”的对象数组。数据数组中的每个对象都彼此不同。

{
  "device": "0013374838793C8",
  "timestamp": "2019-03-04T14:44:39Z",
  "data": [
    { "eparke_status": "09" },
    { "eparke_x": "FFF588" },
    { "eparke_y": "000352" },
    { "eparke_z": "000ACC" },
    { "eparke_temp": "14.00" },
    { "eparke_voltage": "4.17" }
  ]
}

不幸的是,当我使用 AWS Glue 爬虫模式进行爬网时,无法正确推断出我在 Athena 中得到的结果不是我所期望的。

以下清单显示了来自 AWS Athena 的一行数据。

1   0013374838793C8 2019-03-05T13:11:41Z    [{eparke_status=0B, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=FFF6D4, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=000133, eparke_z=null, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=000DA3, eparke_temp=null, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=14.00, eparke_voltage=null}, {eparke_status=null, eparke_x=null, eparke_y=null, eparke_z=null, eparke_temp=null, eparke_voltage=4.17}]

正如您所看到的,数组模式中的每个对象都是“错误地”发现的。DB 中的每一列都包含所有的数组对象字段,其中大部分只是设置为空值,这是可以理解的,因为它们没有找到。发现的模式不是我要找的。
期望

以下清单显示了使用 AWS Glue 爬网后表格行的预期形式。

1   0013374838793C8 2019-03-05T13:11:41Z    eparke_status=0B eparke_x=FFF6D4 eparke_y=000133 eparke_z=000DA3 eparke_temp=14.00 eparke_voltage=4.17

到目前为止我尝试了什么?

AWS Glue 分类器 为了强制架构,我尝试使用分类器。

$.device $.timestamp $.eparke_status $.eparke_x $.eparke_y $.eparke_z $.eparke_temp $.eparke_voltage

$.device $.timestamp $.data[0].eparke_status $.data[1].eparke_x $.data[2].eparke_y $.data[3].eparke_z $.data[4].eparke_temp $.data[5].eparke_voltage

尽管如此,最终模式看起来还是一样的——所有对象都打包在每一列中。

任何想法如何解决这个问题?我也在尝试使用自定义脚本配置 ETL 作业,但到目前为止失败了。

4

1 回答 1

1

我注意到的一件事是,一旦爬虫运行一次,最初推断的模式和选定的爬虫在新的运行中往往不会改变。我只是认为在玩耍时复制爬虫并删除任何以前创建的表更安全。

我不确定您是否可以在 Json 分类器表达式中连接多个根表达式。文档说,对于 JSON 分类器,您只需要提供每行节点的路径,这些节点将被视为实际的 json 以从中推断模式

要使用数组的每个元素来推断模式,您必须使用 $.data[*]。但这意味着您会错过设备和时间戳。

你不能简单地通过爬虫来做到这一点。我的建议是不使用自定义分类器进行解析,然后使用 Athena 查询 ( https://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html ) 从数组结构中 UNNEST 数据。如果需要,将结果加载到某个数据存储区。对于 S3,将 CTAS 视为一个选项。您也许还可以将其配置为 ETL 作业

于 2019-05-30T17:44:34.680 回答