/ / Hive ne parvient pas à désérialiser les champs d'épargne optionnels - ruche, épargne

Hive ne parvient pas à désérialiser les champs d'épargne optionnels - ruche, épargne

Quand je crée une table comme

create table myTable
row format serde "org.apache.hadoop.hive.serde2.thrift.ThriftDeserializer"
with serdeproperties ("serialization.class"="com.myco.MyClass",
"serialization.format"="org.apache.thrift.protocol.TJSONProtocol")
stored as SEQUENCEFILE;

cela fonctionne très bien pour les structures d'épargne avec des champs obligatoires comme

struct MyClass {
1:  required i32 foo;
}

mais structs avec des champs optionnels comme

struct MyClass2 {
1:  optional i32 foo;
}

donne l'erreur suivante

FAILED: SemanticException java.lang.IllegalArgumentException: Error: name expected at the position 11 of "int:struct<>" but ">" is found.

Depuis la ruche permet NULL valeurs pour les colonnes, il existe un mappage évident de la construction facultative.

Comment faire pour que Hive désérialise des classes d'épargne contenant des champs facultatifs?

Merci,

Mike

Réponses:

0 pour la réponse № 1

Avec quelle version de Thrift compilez-vous votre fichier d'épargne? Je suis sur Hive 12 et j’ai eu cette erreur exacte avec épargne sur 0.9.X. J’ai rétrogradé ma version d’épargne à 0.7.0 et cela fonctionne très bien avec Hive 12.

Si vous êtes coincé avec la version actuelle de Hive,rétrograder votre version de Thrift lors de la génération des fichiers Thrift Java. Le ThriftDeserializer dans Hive n'ignore pas certains champs car il est supposé le faire et crée des structures vides facultatives que Hive ne peut pas gérer.

Basé sur la version de Hive sur laquelle vous êtes, vérifiez https://github.com/apache/hive/releases et voyez quelle version de Thrift ils ont utilisée pour la version et utilisez cette version de Thrift pour compiler votre schéma d’épargne en java.