Cette rubrique explique comment créer, lire et écrire dans une table externe JSON sur OSS.
Périmètre
Les tables externes OSS ne prennent pas en charge la propriété cluster.
La taille d'un fichier unique ne doit pas dépasser 2 Go. Vous devez fractionner les fichiers dont la taille est supérieure à 2 Go.
MaxCompute et OSS doivent se trouver dans la même région.
Description des autorisations
Lorsque vous accédez aux tables externes OSS, les données sont consultées via le rôle spécifié dans le paramètre
odps.properties.rolearn, que vous utilisiez un compte Alibaba Cloud, un utilisateur RAM ou un rôle RAM. Par conséquent, vous devez créer un rôle RAM, lui accorder les autorisations nécessaires pour accéder au bucket OSS cible, puis configurer l'ARN de ce rôle dans le paramètreodps.properties.rolearn. Pour plus d'informations, consultez la section Paramètres.Vous pouvez autoriser l'accès depuis le même compte ou entre différents comptes selon vos besoins métier. Nous vous recommandons d'utiliser une politique d'autorisation personnalisée pour un contrôle d'accès plus granulaire. Pour plus d'informations, consultez la section Autorisation pour les sources de données externes.
Créer une table externe
Syntaxe
Si un fichier JSON contient moins de colonnes que la définition de la table externe, MaxCompute remplit les colonnes manquantes par NULL. Si le fichier contient plus de colonnes, MaxCompute ignore les colonnes supplémentaires.
Syntaxe simplifiée
CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS textfile
LOCATION '<oss_location>';
Syntaxe complète
CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
[WITH serdeproperties (
['<property_name>'='<property_value>',...])
]
STORED AS textfile
LOCATION '<oss_location>'
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
Paramètres courants
Pour plus d'informations, consultez la section Paramètres de syntaxe courants.
Paramètres exclusifs
Paramètres Tblproperties
Paramètre | Cas d'utilisation | Description | Valeur | Valeur par défaut |
mcfed.mapreduce.output.fileoutputformat.compress | Pour écrire des données TEXTFILE sur OSS dans un format compressé. | Propriété de compression TEXTFILE. Si la valeur est définie sur |
| False |
mcfed.mapreduce.output.fileoutputformat.compress.codec | Pour écrire des données TEXTFILE sur OSS dans un format compressé. | Propriété de compression TEXTFILE. Définit le codec de compression pour les fichiers de données TEXTFILE. Par défaut, les fichiers sont compressés à l'aide du codec Remarque : Seule la méthode de compression indiquée dans |
| org.apache.hadoop.io.compress.DeflateCodec |
odps.external.data.output.prefix (rétrocompatible avec odps.external.data.prefix) | Pour ajouter un préfixe personnalisé aux noms des fichiers de sortie. |
| Une combinaison de caractères valide, telle que | Aucune |
odps.external.data.enable.extension | Pour ajouter une extension de fichier aux noms des fichiers de sortie. | Si la valeur est définie sur |
| False |
odps.external.data.output.suffix | Pour ajouter un suffixe personnalisé aux noms des fichiers de sortie. | Le suffixe ne peut contenir que des chiffres (0-9), des lettres (a-z, A-Z) et des traits de soulignement (_). | Une chaîne valide, telle que '_hangzhou'. | Aucune |
odps.external.data.output.explicit.extension | Pour ajouter une extension de fichier personnalisée aux noms des fichiers de sortie. |
| Une combinaison de caractères valide, telle que | Aucune |
odps.ext.column.mapping | Ajoutez cette propriété lorsque les noms de champs dans les fichiers de données OSS contiennent des caractères spéciaux. | Cette propriété définit des mappages de noms de colonnes personnalisés. Par exemple, si les champs du fichier OSS sont id BIGINT, $_test DOUBLE et =name STRING, définissez la valeur du paramètre sur t_test:$_test,t_name:=_name lors de la création de la table externe. Vous devez uniquement spécifier les mappages pour les champs contenant des caractères spéciaux. | Aucune valeur fixe | Aucune |
odps.ext.column.mapping.delimiters (À utiliser uniquement lorsque les caractères des noms de colonnes entrent en conflit avec les délimiteurs par défaut dans les mappages de noms de colonnes. Généralement non recommandé.) | Ajoutez cette propriété lorsque les noms de colonnes contiennent les caractères spéciaux | Cette propriété personnalise les délimiteurs intra-groupe et inter-groupe pour les paires clé-valeur. La valeur doit contenir exactement deux caractères : le premier caractère sert de délimiteur clé-valeur, et le second caractère sert de délimiteur entre les différentes paires clé-valeur. | Aucune valeur fixe. Exemple : | Valeur par défaut :
|
odps.text.option.bad.row.skipping | Pour ignorer les données incorrectes dans les fichiers de données OSS. | Spécifie s'il faut ignorer les données incorrectes lorsque MaxCompute lit les fichiers OSS. |
|
Lors de la création d'une table externe pour un format JSON contenant des objets imbriqués (structs), ne définissez pas le type de données du champ d'objet comme STRING ou JSON. Sinon, MaxCompute ne pourra pas analyser ses sous-champs.
Les deux approches suivantes sont recommandées. Pour les étapes détaillées, consultez les exemples de cette rubrique :
Définissez le champ comme STRING et utilisez des fonctions telles que
get_json_objectdans vos requêtes pour extraire le contenu des sous-champs internes selon vos besoins.Utilisez le type
STRUCTpour définir structurellement le champ, en mappant chaque sous-champ de l'objet JSON vers une sous-colonne distincte. Cela vous permet d'accéder directement aux données internes en utilisant la syntaxefield_name.subfield_name.
Liste d'autorisation et liste de blocage
Les tables externes OSS de MaxCompute prennent en charge le filtrage par liste d'autorisation et liste de blocage. En définissant les paramètres de liste d'autorisation et de liste de blocage dans tblproperties, vous pouvez filtrer les fichiers à lire depuis un répertoire. Pour plus de détails, consultez la section Liste d'autorisation et liste de blocage.
Écrire des données
Pour obtenir des informations sur la syntaxe d'écriture des données de MaxCompute vers OSS, consultez la section Écrire des données sur OSS.
Interroger des données
Pour obtenir des informations sur la syntaxe SELECT, consultez la section Lire des données depuis OSS.
Pour savoir comment optimiser les plans de requête, consultez la section Optimisation des requêtes.
Pour plus d'informations sur BadRowSkipping, consultez la section BadRowSkipping.
BadRowSkipping
La fonctionnalité BadRowSkipping vous permet d'ignorer les lignes contenant des données incorrectes ou provoquant des erreurs d'analyse. Elle ne modifie pas l'interprétation du format de données sous-jacent.
Paramètres
-
Paramètre au niveau de la table :
odps.text.option.bad.row.skippingrigid: Force l'ignorance. Ce paramètre ne peut pas être remplacé par les configurations au niveau de la session ou du projet.flexible: Active l'ignorance. Ce paramètre est flexible, ce qui signifie qu'il peut être remplacé par les configurations au niveau de la session ou du projet.
-
Paramètres au niveau
session/project-
Le paramètre
odps.sql.unstructured.text.bad.row.skippingpeut remplacer un paramètre au niveau de la table défini surflexible, mais pas un paramètre défini surrigid.on: Active la fonctionnalité. Si la fonctionnalité n'est pas configurée pour la table, elle est activée par défaut.off: Désactive la fonctionnalité. Si la table est configurée en mode flexible, la fonctionnalité est désactivée. Sinon, le paramètre de la table est utilisé.<null> or invalid input: La configuration au niveau de la table est utilisée.
-
odps.sql.unstructured.text.bad.row.skipping.debug.num: Spécifie le nombre de résultats d'erreur à afficher dans stdout dans Logview.La valeur maximale est 1000.
Si la valeur est <=0, cette fonctionnalité est désactivée.
Si la valeur est invalide, cette fonctionnalité est désactivée.
-
-
Interaction entre les paramètres au niveau de la session et les propriétés de la table
propriété tbl
indicateur de session
résultat
rigid
on
Activé, Forcé
off
<null>, une valeur invalide ou le paramètre n'est pas configuré
flexible
on
Activé
off
Désactivé, Désactivé par la session
<null>, une valeur invalide ou le paramètre n'est pas configuré
Activé
Non configuré
on
Activé, Activé par la session
off
Désactivé
<null>, une valeur invalide ou le paramètre n'est pas configuré
Exemples
-
Préparer les données
Téléchargez les données de test json_bad_row_skipping.json, qui contiennent certaines données incorrectes, vers le répertoire
oss-mc-test/badrow/sur OSS. -
Créer une table externe JSON
Le comportement varie selon la propriété au niveau de la table et l'indicateur au niveau de la session. Les trois cas suivants sont possibles :
Paramètre de table :
odps.text.option.bad.row.skipping = flexible/rigid/<unspecified>Indicateur de session :
odps.sql.unstructured.text.bad.row.skipping = on/off/<not set>
Aucune propriété au niveau de la table
-- No table-level property is set. Errors are handled based on the session-level flag. CREATE EXTERNAL TABLE test_json_bad_data_skipping_flag ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>';Ignorance flexible
-- The table-level property skips error rows, but the session-level flag can disable this behavior. CREATE EXTERNAL TABLE test_json_bad_data_skipping_flexible ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>' tblproperties ( 'odps.text.option.bad.row.skipping' = 'flexible' -- Flexible mode, can be disabled at the session level. );Ignorance rigide
-- The table-level property forces error skipping. This behavior cannot be disabled at the session level. CREATE EXTERNAL TABLE test_json_bad_data_skipping_rigid ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>' tblproperties ( 'odps.text.option.bad.row.skipping' = 'rigid' -- Forced on. ); -
Vérifier les résultats de la requête
Aucune propriété au niveau de la table
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_flag;Si l'ignorance des erreurs est désactivée au niveau de la session (
SET odps.sql.unstructured.text.bad.row.skipping=off), la requête échoue avec l'erreur suivante : FAILED: ODPS-0123131:User defined function exceptionIgnorance flexible
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_flexible;Si l'ignorance des erreurs est désactivée au niveau de la session (
SET odps.sql.unstructured.text.bad.row.skipping=off), la requête échoue avec l'erreur suivante : FAILED: ODPS-0123131:User defined function exceptionIgnorance rigide
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_rigid;Le résultat suivant est renvoyé :
+------------+------------+ | a | b | +------------+------------+ | 1 | 2 | | 15 | 16 | +------------+------------+
Exemples
Prérequis
Vous avez créé un projet MaxCompute.
-
Vous avez préparé un bucket et un répertoire OSS. Pour plus d'informations, consultez les rubriques Créer un bucket et Gérer les répertoires.
Assurez-vous que votre bucket se trouve dans la même région que votre projet MaxCompute.
-
Accordez les autorisations nécessaires.
Vous disposez des autorisations d'accès à OSS. Vous pouvez accéder à une table externe OSS en utilisant un compte Alibaba Cloud, un utilisateur RAM ou un rôle RAM. Pour savoir comment accorder ces autorisations, consultez la section Autorisation STS pour OSS.
Vous possédez l'autorisation CreateTable dans le projet MaxCompute. Pour plus de détails sur les autorisations liées aux tables, reportez-vous à la rubrique Autorisations MaxCompute.
Exemple 1 : Créer, écrire et interroger une table JSON
Cet exemple illustre la création d'une table externe JSON à l'aide du parseur de données open source intégré, l'écriture des données dans OSS, puis leur interrogation.
-
Préparez les données.
Connectez-vous à la console OSS et téléchargez le fichier de données de test json2025.txt dans le répertoire
external-table-test/json/dt=20250521/d'un bucket OSS. Pour plus d'informations, consultez la rubrique Télécharger des fichiers vers OSS. -
Créez une table externe JSON.
CREATE EXTERNAL TABLE mc_oss_extable_name_json ( action STRING, time STRING ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json/'; -
Si votre table externe OSS est partitionnée, vous devez également importer les données de partition. Pour plus d'informations, consultez la rubrique Table externe OSS.
-- Add partitions. MSCK REPAIR TABLE mc_oss_extable_name_json ADD PARTITIONS; -
Lisez les données de la table externe JSON.
SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;Le résultat suivant est renvoyé :
+------------+------------+------------+ | action | time | dt | +------------+------------+------------+ | Close | 1469679568 | 20250526 | | Close | 1469679568 | 20250526 | +------------+------------+------------+ -
Écrivez des données dans la table externe JSON.
INSERT INTO mc_oss_extable_name_json PARTITION (dt='20250526') VALUES ('test','1627273823'); -
Consultez les données écrites.
SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;Le résultat suivant est renvoyé :
+------------+------------+------------+ | action | time | dt | +------------+------------+------------+ | test | 1627273823 | 20250526 | | Close | 1469679568 | 20250526 | | Close | 1469679568 | 20250526 | +------------+------------+------------+
Exemple 2 : Lire des champs JSON imbriqués
Préparation des données
Créez le fichier JSON events.json :
{"a":{"x":1, "y":2}, "id":"123"}
{"a":{"x":3, "y":4}, "id":"345"}
Connectez-vous à la console OSS et téléchargez les données de test dans le répertoire external-table-test/json_struct/ d'un bucket OSS. Pour plus d'informations, consultez la rubrique Télécharger des fichiers vers OSS.
Méthode 1 : Créez une table externe TEXTFILE et utilisez la fonction get_json_object pour lire les valeurs des champs
-
Créez une table externe TEXTFILE contenant une seule colonne de type
string:CREATE EXTERNAL TABLE extable_json_test01 ( col STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\n' STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/'; SELECT * FROM extable_json_test01;Le résultat suivant est renvoyé :
+------------------------------------+ | col | +------------------------------------+ | {"a": {"x": 1, "y": 2},"id":"123"} | | {"a": {"x": 3, "y": 4},"id":"345"} | +------------------------------------+ -
Utilisez la fonction
get_json_objectpour lire les champsaetid:SELECT get_json_object(col, '$.a') AS a, get_json_object(col, '$.id') AS id FROM extable_json_test01;Le résultat suivant est renvoyé :
+-------------------+-----+ | a | id | +-------------------+-----+ | {"x":1,"y":2} | 123 | | {"x":3,"y":4} | 345 | +-------------------+-----+ -
Lisez les champs imbriqués
x,yetid:SELECT get_json_object(get_json_object(col,'$.a'),'$.x') AS x, get_json_object(get_json_object(col,'$.a'),'$.y') AS y, get_json_object(col,'$.id') AS id FROM extable_json_test01;Le résultat suivant est renvoyé :
+---+---+-----+ | x | y | id | +---+---+-----+ | 1 | 2 |123 | | 3 | 4 |345 | +---+---+-----+
Méthode 2 : Créez une table externe JSON et utilisez le type STRUCT pour recevoir les données
-
Créez une table externe au format JSON et utilisez le type
STRUCTpour接收 les champs imbriqués :CREATE EXTERNAL TABLE extable_json_test02 ( a STRUCT<x: BIGINT, y: BIGINT>, id STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/'; -
Interrogez directement les données de la table :
SELECT * FROM extable_json_test02;Le résultat suivant est renvoyé :
+----------+-----+ | a | id | +----------+-----+ | {x:1, y:2}|123 | | {x:3, y:4}|345 | +----------+-----+ -
Vous pouvez également utiliser les fonctions
get_json_objectetTO_JSONpour lire les champsxety:SELECT get_json_object(TO_JSON(a), '$.x') AS x, get_json_object(TO_JSON(a), '$.y') AS y, id FROM extable_json_test02;Le résultat suivant est renvoyé :
+---+---+-----+ | x | y | id | +---+---+-----+ | 1 | 2 |123 | | 3 | 4 |345 | +---+---+-----+
Exemple 3 : Personnaliser les noms de fichiers de sortie
-
Définissez le préfixe personnalisé pour les fichiers écrits dans OSS sur
test06_. La DDL est la suivante :CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom prefix. 'odps.external.data.output.prefix'='test06_') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Après l'écriture des données, les fichiers générés dans OSS portent le préfixe personnalisé
test06_, par exempletest06_202509101. -
Pour personnaliser le suffixe des fichiers écrits dans OSS avec
_beijing, la DDL est la suivante :CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom suffix. 'odps.external.data.output.suffix'='_beijing') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW'); -
Pour générer automatiquement une extension de fichier pour les fichiers de sortie, utilisez la DDL suivante :
CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Automatically generate a file extension. 'odps.external.data.enable.extension'='true') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW'); -
Pour personnaliser l'extension de fichier sur
jsonlpour les fichiers écrits dans OSS, la DDL est la suivante :CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom file extension. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Le nom de fichier généré est
20250905072538695g3mlopvxicr4_M1_1_0_0-0_TableSink1.jsonl, avec l'extension de fichier personnalisée.jsonl. -
Pour les fichiers écrits dans OSS, définissez le préfixe sur
mc_, le suffixe sur_beijinget l'extension de fichier surjsonl. La DDL est la suivante :CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom prefix. 'odps.external.data.output.prefix'='mc_', -- Add a custom suffix. 'odps.external.data.output.suffix'='_beijing', -- Add a custom file extension. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Le nom de fichier généré est
mc_20250905073013526gra1l214x6t6_M1_1_0_0-0_TableSink1_beijing.jsonl, où20250905073013526est l'horodatage généré par le système et la partie centrale correspond à l'identifiant de tâche.
FAQ
Erreur : Unexpected end-of-input: expected close marker for OBJECT
-
Message d'erreur
ODPS-0123131:User defined function exception - Traceback: com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (from [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 0]) at [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 3] at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122) at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152) at com.aliyun.odps.udf.HiveReaderHandler5c9b68c118d14fb2b392e8d916ddea8c.next(Unknown Source) -
Cause
Cette erreur survient généralement lorsque les données JSON sont invalides, comme dans un fichier JSON Lines (JSONL). Elle est déclenchée si un enregistrement contient un caractère de nouvelle ligne non échappé, ce qui viole la règle « un enregistrement par ligne ».
-
Solution
Échappez les caractères de nouvelle ligne dans le fichier JSON, puis lisez les données.
-
Dépannage
Lorsque vous activez BadRowSkipping, les détails concernant les lignes ignorées sont imprimés dans le journal stdout de Logview. Cela vous aide à diagnostiquer les erreurs de données. Utilisez les paramètres suivants pour activer cette fonctionnalité :
-- Set the BadRowSkipping parameter to on at the session level to skip the error data. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Specify the number of error records that can be printed to stdout in Logview. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=<number>;
Erreur de paramètre de liste d'autorisation lors de la lecture d'une table externe JSON : Start token not found where expected
-
Message d'erreur
FAILED: ODPS-0123131:User defined function exception - Traceback: com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122) at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152) Caused by: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:190) at com.aliyun.odps.hive.wrapper.json.JsonEnhancedSerde.deserialize(JsonEnhancedSerde.java:50) at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:120) ... 1 more Caused by: java.io.IOException: Start token not found where expected at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:176) ... 3 more | fatalInstance: Odps/yyy_yueyi_dev_20251226063242326gd2yy12fi2h3_SQL_0_1_0_job_0/M1#0_0 -
Cause
Aucun fichier ne correspond lors de la mise en correspondance par les paramètres de la liste d'autorisation.
-
Solution
Vérifiez que le modèle d'expression régulière dans le paramètre de la liste d'autorisation est correct.
Types de données pris en charge
Pour plus d'informations sur les types de données MaxCompute, consultez les rubriques Types de données (version 1.0) et Types de données (version 2.0).
|
Type |
Pris en charge |
Type |
Pris en charge |
|
TINYINT |
|
STRING |
|
|
SMALLINT |
|
DATE |
|
|
INT |
|
DATETIME |
|
|
BIGINT |
|
TIMESTAMP |
|
|
BINARY |
|
TIMESTAMP_NTZ |
|
|
FLOAT |
|
BOOLEAN |
|
|
DOUBLE |
|
ARRAY |
|
|
DECIMAL(precision, scale) |
|
MAP |
|
|
VARCHAR(n) |
|
STRUCT |
|
|
CHAR(n) |
|
JSON |
|
Formats de compression pris en charge
Pour écrire des fichiers compressés dans OSS, ajoutez la clause tblproperties et configurez les propriétés de compression. Pour plus d'informations, consultez la section Paramètres TBLPROPERTIES.
|
Propriété de compression |
Lecture |
Écriture |
|
Gzip |
|
|
|
BZip2 |
|
|
|
Deflate |
|
|
|
ZSTD |
|
|
|
SNAPPY(SnappyRawCodec) |
|
|
|
SNAPPY(SnappyCodec) |
|
|
Lors de la lecture de fichiers TEXTFILE compressés dont les noms de fichier contiennent les suffixes .bz2, .deflate, .snappy, .gz ou .zstd, aucune configuration supplémentaire n'est requise.
Évolution du schéma prise en charge
Les tables externes JSON mappent les colonnes de la table aux champs JSON par nom.
Dans le tableau suivant, Compatibilité des données indique si la table peut toujours lire correctement les données historiques après une modification du schéma.
Opération | Pris en charge | Description | Compatibilité des données |
Ajouter une colonne |
|
| |
Supprimer une colonne | Les tables externes JSON mappent les colonnes par nom. | Compatible | |
Modifier l'ordre des colonnes | Les tables externes JSON mappent les colonnes par nom. | Compatible | |
Modifier le type de données d'une colonne | Pour obtenir des informations sur les conversions de types de données prises en charge, consultez la section Modifier le type de données d'une colonne. | Compatible | |
Renommer une colonne | Cette opération n'est pas recommandée. Les tables externes JSON mappent les colonnes par nom. Après avoir renommé une colonne, le nom de la colonne dans le fichier JSON ne correspond plus au nouveau schéma, ce qui peut entraîner l'échec des opérations de lecture. |
| |
Modifier le commentaire d'une colonne | Le commentaire doit être une chaîne valide ne dépassant pas 1 024 octets. Sinon, une erreur est signalée. | Compatible | |
Modifier la propriété de non-nullité d'une colonne | Cette opération n'est pas prise en charge. Les colonnes sont nulles par défaut. | Non applicable |