Tous les produits
Search
Centre de documentation

MaxCompute:Type de données JSON

Dernière mise à jour :Aug 10, 2026

Utilisez le type JSON pour stocker des données semi-structurées dans MaxCompute. Lors de l'écriture, MaxCompute extrait automatiquement un schéma public et stocke ces champs au format colonne. Lors de la lecture, l'élagage des colonnes analyse uniquement les champs sollicités par votre requête, offrant ainsi de meilleures performances et un stockage réduit par rapport au type STRING.

Quand utiliser le type JSON


Situation


Recommandation


Les données sont au format JSON semi-structuré ; le schéma varie d'une ligne à l'autre


Utilisez le type JSON


Le schéma est entièrement fixe ; tous les champs sont toujours présents


Utilisez des colonnes typées — meilleure sécurité des types et compatibilité SQL plus étendue


Vous avez besoin d'une clause ORDER BY, GROUP BY ou JOIN sur la colonne JSON


Utilisez des colonnes typées — ces opérations ne sont pas prises en charge sur le type JSON

Fonctionnement

Lorsque vous insérez des données JSON, MaxCompute extrait automatiquement un schéma public à partir des données et applique des optimisations. Les champs du schéma public sont stockés au format colonne. Les champs absents du schéma public sont stockés au format BINARY.

Par exemple, considérons trois lignes contenant les champs a, b et c :

INSERT INTO json_table
SELECT json_parse(string_val)
FROM   string_table;

MaxCompute extrait le schéma public <"a":binary, "b":bigint, "c":bigint>. Une requête ultérieure qui lit uniquement b et c n'analyse que ces colonnes :

SELECT json_val["b"], json_val["c"]
FROM   json_table;
-- Column pruning keeps only b and c.
+------+------+
| _c0  | _c1  |
+------+------+
| 2    | NULL |
| 2    | NULL |
| NULL | 3    |
+------+------+

Les valeurs JSON sont stockées à l'aide des types internes de MaxCompute. En raison de ce mappage, les valeurs situées en dehors de la plage BIGINT ou DOUBLE peuvent provoquer un dépassement de capacité ou une perte de précision.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un projet MaxCompute avec le type JSON activé (voir Activer le type JSON)

  • Java SDK V0.44.0 ou version ultérieure, ou PyODPS V0.11.4.1 ou version ultérieure

  • Si vous utilisez odpscmd : version V0.46.5 ou ultérieure, avec use_instance_tunnel=false dans conf\odps_config.ini

Activer le type JSON

Le paramètre odps.sql.type.json.enable contrôle la disponibilité du type JSON :


Type de projet


Valeur par défaut


Nouveaux projets


true


Projets existants


false

Pour activer le type JSON dans un projet existant :

SET odps.sql.type.json.enable=true;

Pour vérifier la valeur actuelle :

setproject;

Limitations

Référence des contraintes


Catégorie


Contrainte


Implication


Opérations de table


Impossible d'ajouter une colonne JSON à une table existante


Créez une nouvelle table ; migrez les données avec INSERT INTO ... SELECT


Types de table


Les tables clusterisées et le type Delta Table ne sont pas pris en charge


Utilisez des tables standard


Opérations SQL


Les clés ORDER BY, GROUP BY et JOIN sur les colonnes JSON ne sont pas prises en charge


Extrayez d'abord la valeur vers une colonne typée


Opérations SQL


Les opérations de comparaison sur le type JSON ne sont pas prises en charge


Convertissez en STRING ou en colonne typée avant de comparer


Imbrication


Maximum de 20 niveaux de profondeur


Aplatissez les structures profondément imbriquées avant l'ingestion


Compatibilité du moteur


Hologres ne peut pas lire les colonnes JSON


Conservez une copie STRING si des lectures inter-moteurs sont requises


Fonctions définies par l'utilisateur (UDF)


Les UDF Java et Python ne prennent pas en charge le type JSON


Utilisez plutôt les fonctions JSON intégrées


Outils


Dataphin et autres écosystèmes externes ne sont pas pris en charge


Vérifiez la compatibilité avant utilisation

Stockage des types et précision

Les valeurs JSON sont mappées vers des types internes MaxCompute. Les valeurs situées en dehors de ces plages provoquent un dépassement de capacité ou une perte de précision :


Type JSON


Stockage interne


Remarque


NUMBER (partie entière)


BIGINT


Dépassement de capacité si hors de la plage BIGINT


NUMBER (partie décimale)


DOUBLE


Perte de précision possible


STRING


BINARY (non public) ou colonne typée


\u0000 n'est pas pris en charge


BOOLEAN


BOOLEAN


NULL





json 'null' diffère de SQL NULL


ARRAY


ARRAY


OBJECT


OBJECT

Exigences relatives aux outils et SDK


Outil ou SDK


Exigence


odpscmd (client MaxCompute)


V0.46.5 ou version ultérieure ; définissez use_instance_tunnel=false dans conf\odps_config.ini


MaxCompute Studio


Pris en charge


DataWorks


Pris en charge


Java SDK


V0.44.0 ou version ultérieure


PyODPS


V0.11.4.1 ou version ultérieure

Utiliser le type JSON

Tous les exemples ci-dessous utilisent un enregistrement de commande partagé pour illustrer de bout en bout les modèles de création, d'insertion et de requête :

{"id": 1001, "customer": "Molly", "amount": 299.50}

Créer une table JSON

Aucune définition de schéma n'est requise — déclarez simplement la colonne comme JSON :

CREATE TABLE orders (record JSON);

Générer des données JSON

À partir d'un littéral JSON :

INSERT INTO orders VALUES (JSON '{"id": 1001, "customer": "Molly", "amount": 299.50}');

En utilisant JSON_OBJECT et JSON_ARRAY :

-- JSON_OBJECT builds a JSON object from key-value pairs.
INSERT INTO orders SELECT JSON_OBJECT("id", 1002, "customer", "Frank", "amount", 150.00);

-- JSON_ARRAY builds a JSON array.
SELECT JSON_ARRAY("tag1", "tag2", "promo");
-- Returns: ["tag1","tag2","promo"]

En convertissant une colonne STRING :

Utilisez json_parse pour convertir les données chaîne existantes. Combinez-la avec json_valid pour ignorer les lignes mal formées :

INSERT INTO orders
SELECT json_parse(raw_json)
FROM   staging_table
WHERE  json_valid(raw_json);
CAST("abc" AS JSON) et json_parse("abc") se comportent différemment dans les cas limites. Consultez Fonctions JSON pour plus de détails.

Accéder aux données JSON

Tous les exemples ci-dessous interrogent la ligne insérée précédemment : {"id": 1001, "customer": "Molly", "amount": 299.50}.

Accès par index

L'accès par index utilise le mode strict : NULL est renvoyé lorsque le chemin ne correspond pas à la structure des données.

-- Returns 1001
SELECT record['id']
FROM   orders
WHERE  record['id'] IS NOT NULL;

-- Returns "Molly"
SELECT record['customer']
FROM   orders;

-- Returns NULL (field does not exist)
SELECT record['email']
FROM   orders;

L'accès par index est équivalent à JSON_EXTRACT en mode strict :

-- These two expressions return the same result:
SELECT record['id']                          FROM orders;
SELECT JSON_EXTRACT(record, 'strict $.id')   FROM orders;
-- Both return: 1001

Accès à l'aide des fonctions JSON

Deux fonctions sont disponibles :


Fonction


Renvoie


Analyseur de chemin JSON


JSON_EXTRACT


Type JSON


Nouvel analyseur standardisé (sous-ensemble compatible PostgreSQL)


GET_JSON_OBJECT


Type STRING


Ancien analyseur

Utilisez JSON_EXTRACT dans les nouvelles requêtes SQL : son analyseur est cohérent avec l'accesseur par index et prend en charge l'élagage des colonnes en mode strict.

-- JSON_EXTRACT returns a JSON value (with quotes).
SELECT JSON_EXTRACT(record, '$.customer')
FROM   orders;
-- Returns: "Molly"

-- GET_JSON_OBJECT returns a STRING value (no quotes).
SELECT GET_JSON_OBJECT(record, '$.customer')
FROM   orders;
-- Returns: Molly

Référence des chemins JSON

Un chemin JSON identifie un nœud dans les données JSON. L'analyseur utilisé par le type JSON est un sous-ensemble de la spécification JSON Path de PostgreSQL.

Données d'exemple pour les exemples de chemin JSON :

{
  "name": "Molly",
  "phones": [
    { "phonetype": "work",  "phone#": "650-506-7000" },
    { "phonetype": "cell",  "phone#": "650-555-5555" }
  ]
}

Syntaxe de l'accesseur :


Accesseur


Exemple


Description


Membre


$.name


Accéder à un champ par son nom


Membre (caractères spéciaux)


$."phone#"


Utilisez des guillemets pour les noms contenant des caractères spéciaux


Membre générique


$.*


Tous les champs d'un objet


Élément


$.phones[1]


Élément de tableau par index


Plage d'éléments


$.phones[0, 1] ou $[1, 2, 4 to 7]


Éléments aux indices spécifiés ou dans une plage


Élément générique


$.phones[*]


Tous les éléments du tableau

Modes :

JSON Path prend en charge deux modes. Le mode par défaut est lax.


Mode


Comportement


Élagage des colonnes


lax


Enveloppe automatiquement les scalaires sous forme de tableaux et déplie les tableaux en objets lorsque le chemin attend une structure différente. Renvoie les résultats de manière permissive.


Non pris en charge


strict


Renvoie NULL si le chemin ne correspond pas exactement à la structure réelle des données.


Pris en charge

Exemples en mode lax (en utilisant les données d'exemple ci-dessus) :


Expression


Résultat


Raison


lax $.phones.phonetype


["work","cell"]


Déplie le tableau phones et lit phonetype depuis chaque objet


lax $.phones[*].phonetype


["work","cell"]


Accès direct aux éléments génériques


lax $.name[*]


["Molly"]


Enveloppe la chaîne "Molly" dans un tableau


lax $.name.*


NULL


Attend un objet sous name, trouve une chaîne

Exemples en mode strict :


Expression


Résultat


Raison


strict $.phones[1]."phone#"


"650-555-5555"


Correspondance exacte du chemin


strict $.phones.phonetype


NULL


phones est un tableau ; un objet est attendu


strict $.address


NULL


Le champ n'existe pas

Important

Utilisez le mode strict lorsque vous avez besoin de l'élagage des colonnes. Le mode lax ne prend pas en charge l'optimisation par élagage des colonnes.

Considérations de conception

  • Utilisez le mode strict pour l'élagage des colonnes. Le mode lax ne déclenche pas l'optimisation par élagage des colonnes, donc les requêtes en mode lax analysent davantage de données.

  • Maintenez les documents JSON de petite taille. Chaque colonne JSON est stockée comme une seule valeur de colonne. Les documents volumineux augmentent le coût mémoire et E/S par ligne.

  • Validez avant l'ingestion. Utilisez json_valid() pour filtrer les lignes mal formées avant d'appeler json_parse().

  • Vérifiez la précision avant d'insérer de grands nombres. Les nombres JSON sont stockés sous forme de BIGINT (partie entière) et DOUBLE (partie décimale). Les nombres en dehors de ces plages provoquent un dépassement.

  • Planifiez votre schéma avant de créer les tables. Vous ne pouvez pas ajouter de colonne JSON à une table existante. Concevez la table avec la colonne JSON dès le départ.

Exemple de bout en bout

-- Enable the JSON type if your project was created before the feature was enabled.
SET odps.sql.type.json.enable=true;

-- Create a JSON table.
CREATE TABLE orders (record JSON);

-- Ingest from a staging STRING table, skipping malformed rows.
CREATE TABLE staging (raw_json STRING);
INSERT INTO staging VALUES ('{"id": 1001, "customer": "Molly", "amount": 299.50}');

INSERT INTO orders
SELECT json_parse(raw_json)
FROM   staging
WHERE  json_valid(raw_json);

-- Query all non-null records.
SELECT * FROM orders WHERE record IS NOT NULL;
-- Returns:
-- +--------------------------------------------------+
-- | record                                           |
-- +--------------------------------------------------+
-- | {"id":1001,"customer":"Molly","amount":299.5}    |
-- +--------------------------------------------------+

-- Access a specific field.
SELECT record['customer'] FROM orders WHERE record IS NOT NULL;
-- Returns:
-- +-----------+
-- | _c0       |
-- +-----------+
-- | "Molly"   |
-- +-----------+

Étapes suivantes

  • Fonctions JSON — référence complète pour JSON_EXTRACT, GET_JSON_OBJECT, JSON_OBJECT, JSON_ARRAY, json_parse, json_valid et les fonctions associées

  • Expressions CAST — comportement de conversion de type pour JSON