我正在为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字段的任何提示?
答案 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|
+--------------+------------+