2016-09-28 13 views
2

このエラーが発生しましたが、原因はありません。私のpythonコードはpysparkで走った。 stacktraceは長く、私はそれらのいくつかを示しています。すべてのstacktraceは私のコードを表示しないので、どこを探すべきかわかりません。このエラーの原因は何ですか?'ユニコード'オブジェクトの原因は、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値を格納しようとによって引き起こされます。 date.toordinal()メソッドを呼び出すことができると期待されるPython型のSpark内部表現への変換。

おそらく、日付フィールドを持つstruct型で構成されているデータフレームスキーマがあり、その中に文字列を埋め込もうとしていました。

トレースバックに基づいてこれをトレースすることができます。doがあります。 Apache Spark source codeはGitHubでホストされており、トレースバックはpyspark/sql/types.py fileを指しています。

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 

だから我々は、これは構造体で日付フィールドについて知っている行がself.dataType.toInternal()メソッドに委譲がStructField.toInternal() method、を指します。 DateType.fromInternal()はPythonのタイプは逆方向に生成される内容を示しています

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

他の方向に変換するときtoInternal()が同じ型を期待していることを前提としても安全です。

+0

そのようなコードセンス。 _ * bows * _ – erip

+0

ありがとう!私はあなたのヒントに基づいて私のエラーを理解することができる –

関連する問題