Il est fort probable que vous ayez besoin de ce tableau final pour l'utiliser ensuite comme jointure à d'autres tableaux - dans ce cas, avoir ce schéma de type pivot n'est pas l'option la plus efficace de toute façon - je vous recommanderais donc de considérer l'option ci-dessous où vous aplatirez votre matrice originale dans un schéma ID - colonne - valeur.
Dans l'exemple ci-dessous - je suppose que vous avez des ensembles de caractéristiques avec des valeurs Vrai / Faux afin que je puisse facilement réconcilier les valeurs "conflictuelles" en utilisant ET ou OU logique - mais la même approche fonctionnera si vous avez des chaînes de caractères comme "T" , "F" (bien sûr, dans ce cas, le code ci-dessous devra être légèrement ajusté).
Donc, ci-dessous, c'est pour BigQuery Standard SQL et avant d'appliquer ce code, il suffit de charger tous vos fichiers dans des tables séparées (file1 > table1, file2 > table2, etc.).
#standardSQL
CREATE TEMP FUNCTION x(t STRING) AS ((
ARRAY(SELECT AS STRUCT col, val = 'true' val FROM
UNNEST(REGEXP_EXTRACT_ALL(t, r',"(.+?)":(?:true|false)')) col WITH OFFSET
JOIN UNNEST(REGEXP_EXTRACT_ALL(t, r',".+?":(true|false)')) val WITH OFFSET
USING(OFFSET))
));
SELECT id, col, LOGICAL_OR(val) val
FROM (
SELECT ID, col, val FROM `project.dataset.table1` t, UNNEST(x(TO_JSON_STRING(t)))
UNION ALL
SELECT ID, col, val FROM `project.dataset.table2` t, UNNEST(x(TO_JSON_STRING(t)))
)
GROUP BY id, col
Vous pouvez ajouter autant de lignes ci-dessous que vous le souhaitez.
UNION ALL
SELECT ID, col, val FROM `project.dataset.tableX` t, UNNEST(x(TO_JSON_STRING(t)))
Vous pouvez tester, jouer avec ce qui précède en utilisant un échantillon de données de votre question comme dans l'exemple ci-dessous.
#standardSQL
CREATE TEMP FUNCTION x(t STRING) AS ((
ARRAY(SELECT AS STRUCT col, val = 'true' val FROM
UNNEST(REGEXP_EXTRACT_ALL(t, r',"(.+?)":(?:true|false)')) col WITH OFFSET
JOIN UNNEST(REGEXP_EXTRACT_ALL(t, r',".+?":(true|false)')) val WITH OFFSET
USING(OFFSET))
));
WITH `project.dataset.table1` AS (
SELECT 1 ID, TRUE A, TRUE B, TRUE C UNION ALL
SELECT 2, FALSE, TRUE, FALSE UNION ALL
SELECT 3, FALSE, FALSE, FALSE
), `project.dataset.table2` AS (
SELECT 1 ID, TRUE A, TRUE B, TRUE D UNION ALL
SELECT 4, FALSE, TRUE, FALSE UNION ALL
SELECT 5, FALSE, FALSE, FALSE
)
SELECT id, col, LOGICAL_OR(val) val
FROM (
SELECT ID, col, val FROM `project.dataset.table1` t, UNNEST(x(TO_JSON_STRING(t)))
UNION ALL
SELECT ID, col, val FROM `project.dataset.table2` t, UNNEST(x(TO_JSON_STRING(t)))
)
GROUP BY id, col
-- ORDER BY id, col
avec résultat
Row id col val
1 1 A true
2 1 B true
3 1 C true
4 1 D true
5 2 A false
6 2 B true
7 2 C false
8 3 A false
9 3 B false
10 3 C false
11 4 A false
12 4 B true
13 4 D false
14 5 A false
15 5 B false
16 5 D false
D'après mon expérience, dans la plupart des cas, l'utilisation du schéma flatten ci-dessus est plus simple et plus facile que le schéma auquel vous vous attendiez initialement (dans votre question).