Pyspark Dataframe TypeError:期望的字符串或缓冲区

时间:2017-05-22 19:04:09

标签: pyspark spark-dataframe

我正在为Pyspark中的现有数据框创建一个新的coulmn,搜索一个已归档的'script'并返回匹配作为新列的条目。

  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:期望的字符串或缓冲区。

我判断了新添加的列的数据类型

f.dataType for f in k.schema.fields

显示StringType。

但是这个工作正常,其中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字段的任何提示?

1 个答案:

答案 0 :(得分: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|
+--------------+------------+