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:将 pyspark.sql.row 转换为 Dataframe
是否可以在 Pyspark 中对 DataFrame 进行子类化?
在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe