2017-03-10 1 views
0

J'ai brûlé quelques heures sur un problème aujourd'hui et j'ai pensé que je partagerais.Azure Stream Analytics: "Le travail de Stream Analytics comporte des erreurs de validation: la clé donnée n'était pas présente dans le dictionnaire."

J'ai essayé de démarrer une Azure flux Analytics précédemment de travail et l'emploi a été accueilli par un échec rapide:

Failed to start Streaming Job 'shayward10ProcessLogs'.

Je regardais le journal JSON et n'a rien trouvé utile que ce soit. La seule description du problème était:

Stream Analytics job has validation errors: The given key was not present in the dictionary.

Compte tenu de l'erreur et quelques modifications à notre base de données, j'ai essayé ce qui suit à aucun effet:

  • Suppression et Recréer toutes les entrées
  • Suppression et Recréer toutes les sorties
  • tests de course contre les données (provenant de Hub Event) et la sortie semblait bien

Ma requête a regardé comme suit:

SELECT 
    dateTimeUtc, 
    context.tenantId AS tenantId, 
    context.userId AS userId, 
    context.deviceId AS deviceId, 
    changeType, 
    dataType, 
    changeStatus, 
    failureReason, 
    ipAddress, 
    UDF.JsonToString(details) AS details 
INTO 
    [MyOutput] 
FROM 
    [MyInput] 
WHERE 
    logType = 'MyLogType'; 

Je sens donc rien fait commencé à déconstruire ma requête. Je l'ai pris à un seul champ et il a réussi. Je suis allé champ par champ, essayant de comprendre quel champ (le cas échéant) était la cause.

Voir ma réponse ci-dessous.

Répondre

2

La réponse était simple (mais frustrante). Quand je suis arrivé au dernier champ, c'est là l'échec était:

UDF.JsonToString(details) AS details 

Ce fut le seul champ qui a utilisé une fonction définie par l'utilisateur. Après futsing autour, j'ai remarqué que l'éditeur de fonction a montré le titre de la fonction:

udf.JsonToString 

Il était un problème de boîtier. J'avais UDF en MAJUSCULE et Azure Stream Analytics l'attendait en minuscules. J'ai changé mon dernier champ à:

udf.JsonToString(details) AS details 

Cela a fonctionné.

La chose étrange est, il travaillait auparavant. Microsoft a peut-être modifié Azure Stream Analytics pour qu'il soit sensible à la casse dans un endroit où il ne semblait pas l'être auparavant.

Cela a du sens, cependant. JavaScript est sensible à la casse. Chaque objet JavaScript est essentiellement un dictionnaire de membres. Considérez l'erreur:

Stream Analytics job has validation errors: The given key was not present in the dictionary.

L'objet "udf" avait un membre de dictionnaire avec ma fonction dedans. L'objet UDF serait indéfini. Undefined n'a pas ma fonction en tant que membre.

J'espère que ma séance de tête-banging de 2 heures aide quelqu'un d'autre.