是什么导致'unicode'对象在pyspark中没有属性'toordinal'?

Sea*_*yen 4 python pyspark

我得到了这个错误,但我没有导致它.我的python代码在pyspark中运行.堆栈跟踪很长,我只展示其中的一些.所有的堆栈跟踪都没有显示我的代码,所以我不知道在哪里寻找.导致此错误的原因是什么?

/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'
Run Code Online (Sandbox Code Playgroud)

谢谢,

Mar*_*ers 5

尝试将unicode值存储在作为结构的一部分的date数据类型中导致特定异常.Python类型转换为Spark内部表示,期望能够调用date.toordinal()方法.

据推测,你有一个数据帧架构,它由一个带有日期字段的结构类型组成,并试图将字符串填充到该字段中.

您可以根据您的回溯追查这有.在Apache的火花源代码在GitHub上,你的回溯点托管的pyspark/sql/types.py文件.这些行指向该StructField.toInternal()方法,该方法委托给该self.dataType.toInternal()方法:

class StructField(DataType):
    # ...
    def toInternal(self, obj):
        return self.dataType.toInternal(obj)
Run Code Online (Sandbox Code Playgroud)

在你的追溯中最终在该DateType.toInternal()方法:

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

所以我们知道这是关于结构中的日期字段.该DateType.fromInternal()你表演什么Python类型在相反方向上产生:

def fromInternal(self, v):
    if v is not None:
        return datetime.date.fromordinal(v + self.EPOCH_ORDINAL)
Run Code Online (Sandbox Code Playgroud)

可以安全地假设toInternal()在向另一个方向转换时期望相同​​的类型.