переименовать неверные ключи из JSON - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующий поток в NIFI, в JSON есть (1000+) объектов.

invokeHTTP->SPLIT JSON->putMongo

Поток работает нормально, пока я не получу несколько ключей в json с "." во имя. например "Spark.databricks.acl.dfAclsEnabled".

мое текущее решение не оптимально, я набросал плохие ключи и использую текстовый процессор множественной замены для замены "." с "_". Я не использую REGEX, я использую строковый литерал find / replace. Поэтому каждый раз, когда я получаю сбой в процессоре putMongo, я вставляю новый процессор replaceText.

Это невозможно отремонтировать. Мне интересно, могу ли я использовать JOLT для этого? пара информации относительно ввода JSON.

1) нет заданной структуры, единственное, что подтверждается. все будет в массиве событий. Но сам объект события имеет свободную форму.

2) максимальный размер списка = 1000.

3) Сторонний JSON, поэтому я не могу попросить изменить формат.

Также клавиша с «.» Может появляться где угодно. Поэтому я ищу спецификацию JOLT, которая может очистить на всех уровнях, а затем переименовать.

{
  "events": [
    {
            "cluster_id": "0717-035521-puny598",
            "timestamp": 1531896847915,
            "type": "EDITED",
            "details": {
                "previous_attributes": {
                    "cluster_name": "Kylo",
                    "spark_version": "4.1.x-scala2.11",
                    "spark_conf": {
                        "spark.databricks.acl.dfAclsEnabled": "true",
                        "spark.databricks.repl.allowedLanguages": "python,sql"
                    },
                    "node_type_id": "Standard_DS3_v2",
                    "driver_node_type_id": "Standard_DS3_v2",
                    "autotermination_minutes": 10,
                    "enable_elastic_disk": true,
                    "cluster_source": "UI"
                },
                "attributes": {
                    "cluster_name": "Kylo",
                    "spark_version": "4.1.x-scala2.11",
                    "node_type_id": "Standard_DS3_v2",
                    "driver_node_type_id": "Standard_DS3_v2",
                    "autotermination_minutes": 10,
                    "enable_elastic_disk": true,
                    "cluster_source": "UI"
                },
                "previous_cluster_size": {
                    "autoscale": {
                        "min_workers": 1,
                        "max_workers": 8
                    }
                },
                "cluster_size": {
                    "autoscale": {
                        "min_workers": 1,
                        "max_workers": 8
                    }
                },
                "user": ""
            }
        },
    {
      "cluster_id": "0717-035521-puny598",
      "timestamp": 1535540053785,
      "type": "TERMINATING",
      "details": {
        "reason": {
          "code": "INACTIVITY",
          "parameters": {
            "inactivity_duration_min": "15"
          }
        }
      }
    },
    {
      "cluster_id": "0717-035521-puny598",
      "timestamp": 1535537117300,
      "type": "EXPANDED_DISK",
      "details": {
        "previous_disk_size": 29454626816,
        "disk_size": 136828809216,
        "free_space": 17151311872,
        "instance_id": "6cea5c332af94d7f85aff23e5d8cea37"
      }
    }
  ]
}

1 Ответ

0 голосов
/ 03 сентября 2018

Я создал шаблон , используя ReplaceText и RouteOnContent для выполнения этой задачи. Цикл необходим, потому что регулярное выражение заменяет только первый . в ключе JSON при каждом проходе. Возможно, вам удастся уточнить это, чтобы выполнить все замены за один проход, но после слияния регулярных выражений с группами прогнозирования и просмотра в течение нескольких минут, перенаправление было быстрее. Я подтвердил, что это работает с JSON, который вы предоставили, а также JSON с ключами и значениями в разных строках (: на каждой):

...
"spark_conf": {
                        "spark.databricks.acl.dfAclsEnabled":
 "true",
                        "spark.databricks.repl.allowedLanguages"
: "python,sql"
                    },
...

Flow to replace dots in JSON key with underscores

Вы также можете использовать процессор ExecuteScript с Groovy для загрузки JSON, быстрой фильтрации всех ключей JSON, содержащих ., выполнения операции collect для замены и повторной вставки ключей в JSON. данные, если вы хотите, чтобы один процессор сделал это за один проход.

...