4 votes

Pourquoi l'objet 'unicode' n'a pas d'attribut 'toordinal' dans pyspark ?

J'ai obtenu cette erreur, mais je n'en connais pas la cause. Mon code python s'est exécuté dans pyspark. Le stacktrace est long et je n'en montre que quelques uns. Je n'ai pas eu le temps de m'en rendre compte, mais j'ai eu l'occasion d'en faire l'expérience. Je ne sais donc pas où chercher. Quelle est la cause possible de cette erreur ?

/usr/hdp/2.4.2.0-258/spark/python/lib/py4j-0.9-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name)
    306                 raise Py4JJavaError(
    307                     "An error occurred while calling {0}{1}{2}.\n".
--> 308                     format(target_id, ".", name), value)
    309             else:
    310                 raise Py4JError(

Py4JJavaError: An error occurred while calling o107.parquet.

...
File "/usr/hdp/2.4.2.0-258/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 435, in toInternal
    return self.dataType.toInternal(obj)
  File "/usr/hdp/2.4.2.0-258/spark/python/lib/pyspark.zip/pyspark/sql/types.py", line 172, in toInternal
    return d.toordinal() - self.EPOCH_ORDINAL
AttributeError: 'unicode' object has no attribute 'toordinal'

Merci,

5voto

Martijn Pieters Points 271458

L'exception spécifique est causée par la tentative de stockage d'un unicode dans un date qui fait partie d'une structure. La conversion du type Python en représentation interne Spark est nécessaire pour pouvoir appeler la fonction date.toordinal() méthode.

Vous avez probablement un schéma de données quelque part qui consiste en un type struct avec un champ date, et quelque chose a essayé d'y insérer une chaîne de caractères.

Vous pouvez le retracer en vous basant sur la traceback que vous avez créée. faire ont. Les Code source d'Apache Spark est hébergé sur GitHub, et votre traceback pointe vers le fichier pyspark/sql/types.py fichier . Les lignes pointent vers les StructField.toInternal() méthode qui délègue au self.dataType.toInternal() méthode :

class StructField(DataType):
    # ...
    def toInternal(self, obj):
        return self.dataType.toInternal(obj)

qui, dans votre traceback, aboutit à l'adresse DateType.toInternal() méthode :

class DateType(AtomicType):
    # ...
    def toInternal(self, d):
        if d is not None:
            return d.toordinal() - self.EPOCH_ORDINAL

Nous savons donc qu'il s'agit d'un champ de date dans une structure. Les DateType.fromInternal() vous indique quel type de Python est produit dans la direction opposée :

def fromInternal(self, v):
    if v is not None:
        return datetime.date.fromordinal(v + self.EPOCH_ORDINAL)

On peut supposer que toInternal() attend le même type de conversion dans l'autre sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X