2017-07-05 1 views
0

Supposons que j'ai un journal JSON qui affiche les informations suivantes:Spécifiez JSONpaths alternatives

{"timestamp":"someText","alert":"someMoreText","Level":someInt} 

Et j'ai un autre journal JSON qui émet le même genre d'information, mais avec différents de l'étiquette:

{"ts":"someText","alert":"someMoreText","Level":someInt} 

La différence étant "timestamp" et "ts" ont des noms différents mais des informations de même qualité. Comment faire référence, avec un appel de chemin JSON, à l'un des noms alternatifs, si une telle technique est possible?

Ainsi, par exemple, si je voulais faire référence à l'horodatage des deux journaux, je voudrais utiliser quelque chose comme $.[timestamp|ts]

+1

les évaluer séparément, puis utiliser 'ifElse' dans le langage d'expression https://nifi.apache.org/docs/nifi-docs/html/expression-language-guide.html#ifelse – daggett

+0

@daggett Ceci est valide, mais c'est inefficace pour la portée actuelle. Le but était d'optimiser ceci en n'ayant pas à utiliser le processeur d'attributs de mise à jour. Les expressions NiFi ne sont pas supportées dans le processeur EvaluateJSONPath à partir de NiFi 1.3.0 et je voulais voir si je pouvais contourner le problème via cette question. – Jouster500

+0

Je ne vois pas dans la documentation de jsonpath une telle possibilité. Si vous voulez minimiser le nombre de processeurs, utilisez le processeur executescript avec groovy ou javascript. Les deux ont de bonnes fonctionnalités pour travailler avec JSON. – daggett

Répondre

1

En utilisant les nouveaux processeurs d'enregistrement, vous pourriez être en mesure de faire quelque chose comme ...

  • Définir un schéma qui a à la fois 'timestamp' et '' ts
  • Envoyer tous les enregistrements avec 'ts' à un processeur UpdateRecord
  • Réglez le processeur UpdateRecord à faire/horodatage =/ts
  • Définir une autre version du schéma qui n'a pas « ts »
  • Utilisez un processeur ConvertRecord avec un écrivain qui utilise le second schéma

Cette dernière étape serait réécrire les dossiers sans les « ts ' champ. Alternativement, vous pouvez essayer de définir un schéma avec un champ 'timestamp' et un alias de 'ts' qui devrait permettre à n'importe lequel des processeurs d'enregistrement d'accéder aux deux champs en utilisant 'timestamp'. Cela dépend de ce que vous faites dans votre flux pour voir si cela peut être réalisé avec les processeurs d'enregistrement.

+0

Serait-ce prendre environ 3 processeurs? – Jouster500

+0

Oui le plus probable –

+0

Ma configuration actuelle élimine le besoin d'un processeur updateRecord et convertRecord grâce à un routage intelligent et à des spécifications supplémentaires du processeur JSONpath. Je ne doute pas que ce soit une option valide, mais je devrais voir à quel point c'est efficace par rapport à ma configuration actuelle. – Jouster500