2017-05-22 11 views
0

私は、「スクリプト」フィールドの1つと新しい列のエントリとしての一致を検索することによって、Pysparkの既存のデータフレームに新しいcoulmnを作成します。Pyspark Dataframe TypeError:予期される文字列またはバッファ

import re as re 
    def sw_fix(data_str): 
     if re.compile(r'gaussian').search(data_str): 
      cleaned_str = 'gaussian' 
     elif re.compile(r'gromacs').search(data_str): 
      cleaned_str = 'gromacs' 
     else: 
      cleaned_str = 'ns' 
     return cleaned_str 
    sw_fix_udf = udf(sw_fix, StringType()) 
    k=df.withColumn("software_new", sw_fix_udf(df.script)) 

コードが正常に実行され、正しい一致した新しい列にデータフレームkを生成し、しかし、私は上の任意の操作を行うことができません新しく追加された列

k.filter(k.software_new=='gaussian').show() 

は、エラー、例外TypeError:期待される文字列またはバッファ。

IはStringTypeを示し、新たに追加されたカラム

f.dataType for f in k.schema.fields 

のデータ型をchekced。

ただし、これは動作します。ここで、sw_appは元のデータフレームの既存の列です。

k.filter(k.sw_app=='gaussian').select('sw_app','software_new').show(5) 

    +--------+------------+               
    | sw_app|software_new| 
    +--------+------------+ 
    |gaussian| gaussian| 
    |gaussian| gaussian| 
    |gaussian| gaussian| 
    |gaussian| gaussian| 
    |gaussian| gaussian| 
    +--------+------------+ 

software_newフィールドを処理できない理由についてのヒントはありますか?

答えて

0

私は問題なく問題なく動作しています。 pyspark replの以下のデモを参照してください。

>>> from pyspark.sql.functions import udf 
>>> from pyspark.sql.types import StringType 
>>> import re as re 
>>> def sw_fix(data_str): 
...  if re.compile(r'gaussian').search(data_str): 
...  cleaned_str = 'gaussian' 
...  elif re.compile(r'gromacs').search(data_str): 
...  cleaned_str = 'gromacs' 
...  else: 
...  cleaned_str = 'ns' 
...  return cleaned_str 
... 
>>> 
>>> sw_fix_udf = udf(sw_fix, StringType()) 
>>> df = spark.createDataFrame(['gaussian text', 'gromacs text', 'someother text'], StringType()) 
>>> 
>>> k=df.withColumn("software_new", sw_fix_udf(df.value)) 
>>> k.show() 
+--------------+------------+ 
|   value|software_new| 
+--------------+------------+ 
| gaussian text| gaussian| 
| gromacs text|  gromacs| 
|someother text|   ns| 
+--------------+------------+ 

>>> k.filter(k.software_new == 'ns').show() 
+--------------+------------+ 
|   value|software_new| 
+--------------+------------+ 
|someother text|   ns| 
+--------------+------------+ 
+0

私はあなたのサンプルデータを試してみましたが、うまくいきました。だから問題は私のデータフレームdfと仮定します。スクリプトフィールドはStringTypeであり、software_newフィールドもStringTypeです。私はsoftware_newフィールドにnon stringTypeを持たせることがどうして可能か理解していません。 – user3311147

+0

ええ..何かがあなたのセットアップで台無しにされている必要があります..あなたはこの答えを受け入れることができます:) –

関連する問題