Чтение нескольких уровней повторяющихся данных структуры JSON в Google BigQuery

Я пытаюсь прочитать приведенную ниже структуру JSON. Смог получить данные на 1 уровень и правильно увидеть их чтение, но когда я углубляюсь в другие разделы, он не читает данные правильно. Ниже приведены входные данные, а также код, который я использую, и выходные данные для вашего прочтения. Попросите вашу помощь с этим.

  • ВВОДНЫЕ ДАННЫЕ:

    }, {"ComboId": "5970", "Demands": {"DownHoleTools": {"PrimaryTools": [

        ]
      },
      "SurfaceTools": {
        "PrimaryTools": [
          {
            "ToolCode": "19153",
            "ToolDescription": "MDT_Surface Eqpt",
            "IsEdoApplicable": false,
            "Source": "A",
            "DemandDurationInfo": {
              "StartDate": "2020-02-12T15:18:32",
              "EndDate": "2020-02-13T15:18:32"
            },
            "HashNumber": 1,
            "ClassificationName": "MDT_Surface Eqpt",
            "ClassificationType": 1,
            "GroupInfo": {
              "Code": "965",
              "Description": "MDT Accessories"
            },
            "CategoryInfo": {
              "Code": "965",
              "Description": "MDT Accessories"
            },
            "Comments": "",
            "IsDeleted": false,
            "PartNumber": "",
            "Description": "MDT_Surface Eqpt",
            "CreatedDate": "0001-01-01T00:00:00",
            "CreatedBy": "",
            "LastModifiedDate": "0001-01-01T00:00:00",
            "LastModifiedBy": "",
            "Id": "1"
          },
          {
            "ToolCode": "19153",
            "ToolDescription": "MDT_Surface Eqpt",
            "IsEdoApplicable": false,
            "Source": "A",
            "DemandDurationInfo": {
              "StartDate": "2020-02-12T15:18:32",
              "EndDate": "2020-02-13T15:18:32"
            },
            "HashNumber": 2,
            "ClassificationName": "MDT_Surface Eqpt",
            "ClassificationType": 1,
            "GroupInfo": {
              "Code": "965",
              "Description": "MDT Accessories"
            },
            "CategoryInfo": {
              "Code": "965",
              "Description": "MDT Accessories"
            },
            "Comments": "",
            "IsDeleted": false,
            "PartNumber": "",
            "Description": "MDT_Surface Eqpt",
            "CreatedDate": "0001-01-01T00:00:00",
            "CreatedBy": "",
            "LastModifiedDate": "0001-01-01T00:00:00",
            "LastModifiedBy": "",
            "Id": "1"
          }
        ],
        "BackupTools": [
    
        ]
      },
      "Techniques": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Services": [
    
      ],
      "Tools": ""
    },
    "ComboType": 2,
    "HashCode": "",
    "SequenceNumber": "",
    "ConveyanceInfo": "",
    "CreatedDate": "0001-01-01T00:00:00",
    "CreatedBy": "",
    "LastModifiedDate": "0001-01-01T00:00:00",
    "LastModifiedBy": "",
    "Id": "98e9418f-e50a-417b-affb-5fc4c1f71f39"
    

    }, {"ComboId": "5971", "Demands": {"DownHoleTools": {"PrimaryTools": [

        ],
        "BackupTools": [
    
        ]
      },
      "SurfaceTools": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Techniques": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Services": [
    
      ],
      "Tools": ""
    },
    "ComboType": 1,
    "HashCode": "",
    "SequenceNumber": "",
    "ConveyanceInfo": "",
    "CreatedDate": "0001-01-01T00:00:00",
    "CreatedBy": "",
    "LastModifiedDate": "0001-01-01T00:00:00",
    "LastModifiedBy": "",
    "Id": "944cf025-2a8c-4372-9f87-6c80c844ac68"
    

    }, {"ComboId": "26793", "Demands": {"DownHoleTools": {"PrimaryTools": [

        ],
        "BackupTools": [
    
        ]
      },
      "SurfaceTools": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Techniques": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Services": [
    
      ],
      "Tools": ""
    },
    "ComboType": 0,
    "HashCode": "",
    "SequenceNumber": "",
    "ConveyanceInfo": "",
    "CreatedDate": "0001-01-01T00:00:00",
    "CreatedBy": "",
    "LastModifiedDate": "0001-01-01T00:00:00",
    "LastModifiedBy": "",
    "Id": "0a9338b2-aa95-4d5a-8e57-1305e78fec0c"
    

    }], «CreatedDate»: «2019-09-09T13: 12: 14.94», «CreatedBy»: «VHiremath», «LastModifiedDate»: «2020-02-27T07: 40: 08.071», «LastModifiedBy»: «VPanath» , "Id": "5d764fae3d6a351088a1c9d3"}

        ],
        "BackupTools": [
    
        ]
      },
      "SurfaceTools": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Techniques": {
        "PrimaryTools": [
    
        ],
        "BackupTools": [
    
        ]
      },
      "Services": [
        {
          "Code": "GIWS",
          "Name": "Grease Injection WHE Service",
          "Description": "",
          "GroupInfos": "",
          "ClassificationType": 4,
          "LegacySystemMapping": [
            {
              "LegacyId": "EE61B186-CE57-46A8-B280-FE913CC8FF33",
              "LegacySystemMappedProperty": "Grease Injection WHE Service",
              "LegacySystemName": "ODM"
            },
            {
              "LegacyId": "2e4b1aea-3d91-43b6-9c32-a165a546ed39",
              "LegacySystemMappedProperty": "Grease Injection WHE Service",
              "LegacySystemName": "OSCompliance"
            }
          ],
          "Source": "A",
          "Comments": "",
          "Id": "9c405cc1-5231-4baf-864f-7974bb4fbe07"
        },
        {
          "Code": "SCNNGWS",
          "Name": "Slick Cable Non-Grease Injection WHE Service",
          "Description": "",
          "GroupInfos": "",
          "ClassificationType": 4,
          "LegacySystemMapping": [
            {
              "LegacyId": "7B41D3DD-A6A7-47AF-81CD-5D8C248183B5",
              "LegacySystemMappedProperty": "Slick Cable Non-Grease Injection WHE Service",
              "LegacySystemName": "ODM"
            },
            {
              "LegacyId": "399e61ed-353a-404f-aad3-1e84c46cb273",
              "LegacySystemMappedProperty": "Slick Cable Non-Grease Injection WHE Service",
              "LegacySystemName": "OSCompliance"
            }
          ],
          "Source": "A",
          "Comments": "",
          "Id": "0a4848d3-7d93-4721-a556-2ecf1b0a7f43"
        },
        {
          "Code": "TPWS",
          "Name": "Third Party WHE Service",
          "Description": "",
          "GroupInfos": "",
          "ClassificationType": 4,
          "LegacySystemMapping": [
            {
              "LegacyId": "CAF5754A-3F90-40C6-82AC-0A4F484A4E74",
              "LegacySystemMappedProperty": "Third Party WHE Service",
              "LegacySystemName": "ODM"
            },
            {
              "LegacyId": "50ff1668-0b3b-489c-a7ad-794e327028e5",
              "LegacySystemMappedProperty": "Third Party WHE Service",
              "LegacySystemName": "OSCompliance"
            }
          ],
          "Source": "A",
          "Comments": "",
          "Id": "ee923f9e-210f-4c36-8fc4-f1e9521d0cbe"
        },
        {
          "Code": "WLPPS",
          "Name": "Wireline Low Pressure Packoff Service",
          "Description": "",
          "GroupInfos": "",
          "ClassificationType": 4,
          "LegacySystemMapping": [
            {
              "LegacyId": "CB79CDE1-2271-418D-9E67-D4B07E94AC61",
              "LegacySystemMappedProperty": "Wireline Low Pressure Packoff Service",
              "LegacySystemName": "ODM"
            },
            {
              "LegacyId": "514650dd-5b71-4889-b991-0d77dd355666",
              "LegacySystemMappedProperty": "Wireline Low Pressure Packoff Service",
              "LegacySystemName": "OSCompliance"
            }
          ],
          "Source": "A",
          "Comments": "",
          "Id": "2216c1c0-41ba-40aa-90c2-1096e8191d2c"
        }
      ],
      "Tools": ""
    },
    "ComboType": 2,
    "HashCode": "",
    "SequenceNumber": "",
    "ConveyanceInfo": "",
    "CreatedDate": "0001-01-01T00:00:00",
    "CreatedBy": "",
    "LastModifiedDate": "0001-01-01T00:00:00",
    "LastModifiedBy": "",
    "Id": "446d43e1-6476-4408-b850-e5f233933ba9"
    

    Код:

Ожидаемый результат:

CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  var result = jsonPath(JSON.parse(json), json_path);
  if(result){return result;} 
  else {return [];}
"""
OPTIONS (
    library="gs://temp-dev-workspace/json_temp/jsonpath-0.8.0.js"
);

SELECT job_id,
combo_id,
tool_code
from temp.dbm_eqp_data,
UNNEST(CUSTOM_JSON_EXTRACT(conv_column, '$.Combos[*].ComboId')) combo_id,
UNNEST(CUSTOM_JSON_EXTRACT(conv_column, '$.Combos[*].Demands.DownHoleTools.PrimaryTools[*].ToolCode')) tool_code
;

ожидаемый результат

Ниже приведен стандартный SQL BigQuery.


person Nanda    schedule 30.03.2020    source источник
comment
1. вы можете связаться только с участниками SO, которые уже отправили сообщение - в этом случае они получат ваше сообщение в своем почтовом ящике. В противном случае игнорируется. 2. вам нужно сузить проблему до чего-то, с чем легко работать / работать. Постарайтесь упростить (сделать короче) пример и объяснить ожидаемый результат.   -  person Nanda    schedule 30.03.2020
comment
@MikhailBerlyant - Большое спасибо, вы всегда спаситель ... Я привел пример входных данных, ожидаемый результат и код, который у меня есть в настоящее время для решения этой проблемы. Запросите вашу помощь.   -  person Mikhail Berlyant    schedule 30.03.2020
comment
я скоро проверю: о)   -  person Nanda    schedule 30.03.2020
comment
@MikhailBerlyant - Еще раз большое спасибо   -  person Mikhail Berlyant    schedule 30.03.2020
comment
@MikhailBerlyant - Я расширил это решение для другого набора, и оно отлично работает   -  person Nanda    schedule 30.03.2020
comment
Большое спасибо, я расширил его, чтобы читать другие атрибуты для каждого кода инструмента, и он отлично работает.   -  person Nanda    schedule 30.03.2020


Ответы (1)


Если применить к образцу данных из вашего вопроса - вывод

#standardSQL
CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS '''
  var result = jsonPath(JSON.parse(json), json_path);
  if(result){return result;} 
  else {return [];}
'''
OPTIONS (
    library="gs://temp-dev-workspace/json_temp/jsonpath-0.8.0.js"
);
SELECT 
  job_id,
  combo_id,
  tool_code
FROM `temp.dbm_eqp_data`,
UNNEST(CUSTOM_JSON_EXTRACT(conv_column, '$.Combos[*].ComboId')) combo_id
LEFT JOIN UNNEST(CUSTOM_JSON_EXTRACT(conv_column, '$.Combos[?(@.ComboId=="' || combo_id || '")].Demands.DownHoleTools.PrimaryTools[*].ToolCode')) tool_code

@Mikhail Berlyant - Запросите здесь свою экспертную помощь, я перепробовал все возможные решения, предложенные ранее, но мне что-то здесь не хватает. просить вашу помощь

Row job_id  combo_id    tool_code    
1   1       9146        19139    
2   1       9146        7030     
3   1       9146        3707     
4   1       9146        3707     
5   1       5970        null     
6   1       5971        null     
7   1       26793       null     
person Mikhail Berlyant    schedule 30.03.2020
comment
Я попытался расширить его для чтения всех атрибутов, но он просто выполняется и никогда не возвращает никакого результата. Я делаю здесь что-то не так. КОД: UNNEST (CUSTOM_JSON_EXTRACT (conv_column, '$ .Equipments.Combos [*]. ComboId')) combo_id ЛЕВЫЙ JOIN UNNEST (CUSTOM_JSON_EXTRACT (conv_column, '$ .Combos [? (@. ComboId_id ==' || 'comboId ==' || 'comboId ==' || 'comboId ==' || )]. Demands.DownHoleTools.PrimaryTools [*]. ToolCode ')) tool_code LEFT JOIN UNNEST (CUSTOM_JSON_EXTRACT (conv_column,' $ .Combos [? (@. ComboId == '|| combo_id ||')]. Demands.DownHole .PrimaryTools [? (@. ToolCode == '|| tool_code ||')]. ToolDescription ')) tool_description - person Nanda; 30.03.2020
comment
комментарии не подходят для получения подробной информации - в любом случае - на ваш текущий вопрос дан полный ответ - если у вас есть новый вопрос - отправьте новый, и я (мы) будем рады помочь. вот как это работает здесь, в SO: o) - person Nanda; 30.03.2020
comment
Конечно, я запрошу новый вопрос. Еще раз большое спасибо - person Mikhail Berlyant; 30.03.2020
comment
Секундочку - мне кажется, у вас есть опечатки - дайте мне секунду - person Nanda; 30.03.2020
comment
Я думаю, что у вас есть дополнительное оборудование в первом UNNEST - я просто запускаю его, и он работает - если все еще нет - в этом случае - опубликуйте новый вопрос - person Mikhail Berlyant; 30.03.2020
comment
Позвольте нам продолжить это обсуждение в чате. - person Mikhail Berlyant; 30.03.2020
comment
{"ProjectId": "P.2000002", "OperationId": "O.2000002.01", "ActivityId": "A.2000002.01.01", "Описание": "", "Комбинации": [{"ComboId": «9146», «Требования»: {«DownHoleTools»: {«PrimaryTools»: [{«ToolCode»: «19139», «ToolDescription»: «VSIT-C / D», «IsEdoApplicable»: true, «Source»: «A», «DemandDurationInfo»: {«StartDate»: «2019-09-09T17: 42: 10», «EndDate»: «2019-09-19T23: 00: 00»}, «HashNumber»: 1, «ClassificationName ":" VSIT-C / D "," ClassificationType ": 0," GroupInfo ": {" Code ":" 1519 "," Description ":" VSIT "}," CategoryInfo ": {" Code ":" 1519 " , "Description": "VSIT"}, "Comments": "", "IsDeleted": false, "PartNumber": "", "Description": "", "CreatedDate": "00 01-01-01T00: 00: 00 "," CreatedBy ":" "," LastModifiedDate ":" 0001-01-01T00: 00: 00 "," LastModifiedBy ":" "," Id ":" 1 "}, {"ToolCode": "7030", "ToolDescription": "VSIB-P", "IsEdoApplicable": false, "Source": "A", "DemandDurationInfo": {"StartDate": "2019-09-09T17: 42 : 12 "," EndDate ":" 2019-09-19T23: 00: 00 "}," HashNumber ": 1," ClassificationName ":" VSIB-P "," ClassificationType ": 0," GroupInfo ": {" Код ":" 1519 "," Описание ":" VSIT "}," CategoryInfo ": {" Код ":" 1519 "," Описание ":" VSIT "}," Комментарии ":" "," IsDeleted ": false, "PartNumber": "", "Описание": "", "CreatedDate": "0001-01-01T00: 00: 00", "CreatedBy": "", "LastModifiedDate": "0001-01-01T00: 00: 00", "LastModifiedBy": "", "Id": "1"}, {"ToolCode": "3707", "ToolDescription": "HILT-TLD- H "," IsEdoApplicable ": false," Source ":" A "," DemandDurationInfo ": {" StartDate ":" 2020-02-12T15: 18: 32 "," EndDate ":" 2020-02-13T15: 18 : 32 "}," HashNumber ": 1," ClassificationName ":" HILT-TLD-H "," ClassificationType ": 0," GroupInfo ": {" Code ":" 842 "," Description ":" HILT "} , "CategoryInfo": {"Код": "842", "Описание": "HILT"}, "Комментарии": "", "IsDeleted": false, "PartNumber": "", "Описание": "HILT- TLD-H "," CreatedDate ":" 0001-01-01T00: 00: 00 "," CreatedBy ":" "," LastModifiedDate ":" 0001-01-01T00: 00: 00 "," LastModifiedBy ":" "," Id ":" 1 "}, {" ToolCode ":" 3707 "," ToolDescription ":" HILT-TLD-H "," IsEdoApplicable ": false," Source ":" A "," DemandDurationInfo ": {" StartDate ":" 2020-02-12T15: 18: 32 "," EndDate ":" 2020-02-13T15: 18: 32 "}, «HashNumber»: 2, «ClassificationName»: «HILT-TLD-H», «ClassificationType»: 0, «GroupInfo»: {«Code»: «842», «Description»: «HILT»}, «CategoryInfo»: {"Код": "842", "Описание": "HILT"}, "Комментарии": "", "IsDeleted": false, "PartNumber": "", "Описание": "HILT-TLD-H", «CreatedDate»: «0001-01-01T00: 00: 00», «CreatedBy»: «», «LastModifiedDate»: «0001-01-01T00: 00: 00», "LastModifiedBy": "", "Id": "1"}], "BackupTools": [ - person Nanda; 30.03.2020