2016-08-19 40 views
1

"latest_travel_date"という名前の列のいくつかの特定の日付値を "NA"で置き換えるUDFを作成しました。ただし、この列には多くのNULL値も含まれているため、これもUDFで処理しました。NameError:グローバル名 'NoneType'がSparkで定義されていません

Query: 
def date_cleaner(date_col): 
    if type(date_col) == NoneType: 
     pass 
    else: 
     if year(date_col) in ('1899','1900'): 
      date_col= 'NA' 
     else: 
      pass 
    return date_col 

date_cleaner_udf = udf(date_cleaner, DateType()) 

Df3= Df2.withColumn("latest_cleaned", date_cleaner_udf("latest_travel_date")) 

(下記を参照してください)しかし、私は継続的にエラーを取得しています: NameError:グローバル名を「NoneType」

が定義されていない誰も私がこれを解決するために助けてくださいことはできますか?

if type(date_col) == NoneType: 

それはあなたが実際にしたいのようになります:

答えて

1

問題は、このラインである

if date_col is None: 
+0

これを実行すると、エラーが発生します。 'NoneType'オブジェクトに '_jvm'属性がありません。 – Preyas

+0

@Preyasは同じ行から報告されますか?あなたのスタックトレースは何ですか? –

+0

エラーを生成する行は2つのクエリ間で変更されません。 – Preyas

3

この問題は、次の2つの方法で解決することができます。

dataFrameからNull値を検索する場合は、NullTypeを使用してください。

if type(date_col) == NullType 

それともDATE_COLはこのようなNoneであれば、あなたが見つけることができます:

if date_col is None 

私はこのヘルプを願っています。このよう

。マイケルが指摘

+0

私はあなたが提案したように両方のオプションを試しましたが、エラーで終わります:AttributeError: 'NoneType'オブジェクトに '_jvm'属性がありません – Preyas

+0

何かできますか?質問にデータフレームの一部を追加できますか?私はあなたが私の火花の中でしたのと同じことをしました。しかし、この問題は起こらなかった。このdataFrameを参照する必要があります。 –

0

として、あなたはNoneにタスクを完了しないことを変える、しかし

if type(date_col) == NoneType: 

を行うことはできません。

date_col= 'NA' 

を持つ別の問題は、それがStringTypeのですが、あなたは戻り値の型はDateTypeとして宣言があります。コメントの中のあなたの_jvmエラーは、このデータタイプの不一致を訴えていました。

または1900の場合はdate_colNoneに設定し、すべてのNullをドロップするだけです。もしそうなら、あなたはこれを行うことができます:

def date_cleaner(date_col): 
    if date_col: 
     if year(date_col) in ('1899','1900'): 
      return None 

    return date_col 

date_cleaner_udf = udf(date_cleaner, DateType()) 

Df3= Df2.withColumn("latest_cleaned", date_cleaner_udf("latest_travel_date")).dropna(subset=["latest_travel_date"]) 

DateTypeは、(デフォルトでは)有効な日時またはNullを取ることができるいずれかのためです。 dropnaを実行して、データフレームを "クリーン"することができます。

関連する問題