我收到了这个错误,但我不知道是什么原因造成的。我的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'
谢谢,
答案 0 :(得分:5)
特定的异常是由于尝试将unicode
值存储在作为结构一部分的 date 数据类型中引起的。 Python类型到Spark内部表示的转换期望能够调用date.toordinal()
方法。
据推测,你有一个数据帧架构,它由一个带有日期字段的结构类型组成,并且试图将字符串填充到该字段中。
您可以根据做所拥有的追溯来追踪此情况。 Apache Spark source code托管在GitHub上,您的回溯指向pyspark/sql/types.py
file。这些行指向StructField.toInternal()
method,它委托给self.dataType.toInternal()
方法:
class StructField(DataType):
# ...
def toInternal(self, obj):
return self.dataType.toInternal(obj)
回溯中的最终位于DateType.toInternal()
method:
class DateType(AtomicType):
# ...
def toInternal(self, d):
if d is not None:
return d.toordinal() - self.EPOCH_ORDINAL
所以我们知道这是关于结构中的日期字段。 DateType.fromInternal()
显示了相反方向生成的Python类型:
def fromInternal(self, v):
if v is not None:
return datetime.date.fromordinal(v + self.EPOCH_ORDINAL)
可以安全地假设toInternal()
在向另一个方向转换时需要相同的类型。