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

Posted

技术标签:

【中文标题】Pyspark Dataframe TypeError:预期的字符串或缓冲区【英文标题】:Pyspark Dataframe TypeError: expected string or buffer 【发布时间】:2017-05-22 19:04:09 【问题描述】:

我正在通过搜索已归档的“脚本”之一并返回匹配项作为新列的条目,为 Pyspark 中的现有数据框创建一个新库。

  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: expected string or buffer。

我检查了新添加列的数据类型

f.dataType for f in k.schema.fields

显示字符串类型。

然而这个工作,其中 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】:

它对我来说工作正常,没有任何问题。请参阅 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|
+--------------+------------+

【讨论】:

我尝试了您的示例数据,效果很好。所以我认为问题出在我的数据框 df 上。 script 字段是 StringType,software_new 字段也是 StringType。我不明白software_new 字段中怎么可能有非stringType。 是的..你的设置应该搞砸了..顺便说一句,你能接受这个答案吗:)

以上是关于Pyspark Dataframe TypeError:预期的字符串或缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

PySpark数据分析基础:PySpark基础功能及DataFrame操作基础语法详解

PySpark:转换DataFrame中给定列的值

PySpark|比RDD更快的DataFrame

Pyspark:将 pyspark.sql.row 转换为 Dataframe

是否可以在 Pyspark 中对 DataFrame 进行子类化?

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe