2017-01-19 1 views
1

Je diffuse l'entrée JSON à partir du stockage BLOB. La plupart des données du JSON sont stockées en tant que paires nom/valeur dans un tableau. J'ai besoin d'envoyer chaque entrée comme une seule sortie où chaque paire nom/valeur est transposée à une colonne dans la sortie. J'ai un code qui fonctionne lorsque vous utilisez la fonction "Test" lors de la modification de la requête. Toutefois, lors du test en direct, seule la sortie debugblob1 reçoit des données. Pourquoi le test en direct fonctionnerait-il différemment du test de requête? Existe-t-il un meilleur moyen de transposer des données de tableau en colonnes? Remarque: Les paires nom/valeur du tableau sont toujours les mêmes, bien que je ne souhaite pas qu'une solution dépendant de leur ordre soit toujours la même, car cela échappe à mon contrôle.La transposition de valeurs de tableau JSON en rangées dans Stream Analytics ne génère aucune sortie

QUERY

-- Get one row per input and array value 
WITH OneRowPerArrayValue AS 
(SELECT 
    INPUT.id AS id, 
    ARRAYVALUE.ArrayValue.value1 AS value1, 
    ARRAYVALUE.ArrayValue.value2 AS value2 
FROM 
    [inputblob] INPUT 
    CROSS APPLY GetElements(INPUT.arrayValues) as ARRAYVALUE), 

-- Get one row per input, transposing the array values to columns. 
OneRowPerInput AS 
(SELECT 
    INPUT.id as id, 
    ORPAV_value1.value1 as value1, 
    ORPAV_value2.value2 as value2 
FROM 
    [inputblob] INPUT 
    left join OneRowPerArrayValue ORPAV_value1 ON ORPAV_value1.id = INPUT.id AND ORPAV_value1.value1 IS NOT NULL AND DATEDIFF(microsecond, INPUT, ORPAV_value1) = 0 
    left join OneRowPerArrayValue ORPAV_value2 ON ORPAV_value2.id = INPUT.id AND ORPAV_value2.value2 IS NOT NULL AND DATEDIFF(microsecond, INPUT, ORPAV_value2) = 0 
WHERE 
    -- This is so that we only get one row per input, instead of one row per input multiplied by number of array values 
    ORPAV_value1.value1 is not null) 

SELECT * INTO debugblob1 FROM OneRowPerArrayValue 

SELECT * INTO debugblob2 FROM OneRowPerInput 

DONNÉES

{"id":"1","arrayValues":[{"value1":"1"},{"value2":"2"}]} 
{"id":"2","arrayValues":[{"value1":"3"},{"value2":"4"}]} 
+0

Avez-vous essayé d'envoyer l'entrée "brute" non transformée à un récepteur de débogage? Si cela fonctionne avec des données de test et non en direct, la première chose que je exclurais est des différences imprévues dans le format des données. –

+0

Je testais en téléchargeant manuellement les données sur la source d'entrée de stockage blob, donc je suis en contrôle des données. J'ai parlé avec le support MS et ils peuvent le reproduire mais pas l'expliquer, donc c'est peut-être un bug. J'abandonne pour le moment! –

Répondre

0

Voir mon exemple générique ci-dessous. Je crois que c'est ce que vous demandez; où vous avez un objet JSON qui contient un tableau d'objets json.

WITH MyValues AS 
(
    SELECT 
    arrayElement.ArrayIndex, 
    arrayElement.ArrayValue 
    FROM Input as event 
    CROSS APPLY GetArrayElements(event.<JSON Array Name>) AS arrayElement 
) 
SELECT ArrayValue.Value1, CAST(ArrayValue.Value2 AS FLOAT) AS Value 
INTO Output 
FROM MyValues