2016-09-28 44 views
2

我得到這個錯誤,但我不是什麼原因造成的。我的python代碼在pyspark中運行。堆棧跟蹤很長,我只是展示其中的一些。所有的堆棧跟蹤都沒有顯示我的代碼,所以我不知道在哪裏尋找。什麼可能導致這個錯誤?什麼導致'unicode'對象在pyspark中沒有屬性'toordinal'?

/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

你能顯示導致錯誤的代碼嗎? – David

+0

你切斷了回溯。你能否顯示*更多的代碼行*?我可以追溯到一個'StructField'。也許父行顯示該字段的存儲位置。 –

回答

3

具體的異常是由試圖存儲在日期數據類型,它是一個結構的一部分unicode值造成的。 Python類型向Spark內部表示的轉換預計能夠調用date.toordinal()方法。

大概你有一個數據幀架構,它由一個帶有日期字段的結構類型組成,並且有東西試圖將一個字符串填充到該字段中。

您可以根據您的做的012back跟蹤回溯到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 

因此,我們知道這是關於一個日期字段一個struct 。該DateType.fromInternal()向您展示了Python類型在相反的方向上產生:

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

它是安全的假設,toInternal()在另一個方向轉換時預計的相同類型。

+0

這樣的代碼意義。 _ *弓* _ – erip

+0

謝謝!我能夠根據你的提示找出我的錯誤 –

相關問題