簡體   English   中英

使用 AWS Glue 爬網程序/分類器/ETL 作業將帶有數組的 JSON 展平

[英]Flatten JSON with array using AWS Glue crawler / classifier / ETL job

我正在從 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 作業,但到目前為止失敗了。

我注意到的一件事是,一旦一個爬蟲運行一次,最初推斷的模式和選定的爬蟲在新的運行中往往不會改變。 我只是認為在玩游戲時復制爬蟲並刪除任何以前創建的表更安全。

我不確定您是否可以在 Json 分類器表達式中連接多個根表達式。 文檔說,對於 JSON 分類器,您只需要提供每行節點的路徑,該路徑將被視為實際的 json 以從中推斷架構

要使用數組的每個元素來推斷模式,您必須使用 $.data[*]。 但這意味着您會錯過設備和時間戳。

你不能簡單地通過爬蟲來做到這一點。 我的建議是不使用自定義分類器進行解析,然后使用 Athena 查詢 ( https://docs.aws.amazon.com/athena/latest/ug/flattening-arrays.html ) 從數組結構中取消嵌套數據。 如果需要,將結果加載到某個數據存儲。 對於 S3,將 CTAS 視為一個選項。 您也可以將其配置為 ETL 作業

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM