删除 pyspark 数据框列中的非 ascii 和特殊字符
Removing non-ascii and special character in pyspark dataframe column
我正在从大约有 50 列的 csv 文件中读取数据,其中少数列(4 到 5)包含具有非 ASCII 字符和特殊字符的文本数据。
df = spark.read.csv(path, header=True, schema=availSchema)
我正在尝试删除所有非 Ascii 字符和特殊字符,只保留英文字符,我尝试按如下方式进行操作
df = df['textcolumn'].str.encode('ascii', 'ignore').str.decode('ascii')
我的列名中没有空格。我收到一个错误
TypeError: 'Column' object is not callable
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<command-1486957561378215> in <module>
----> 1 InvFilteredDF = InvFilteredDF['SearchResultDescription'].str.encode('ascii', 'ignore').str.decode('ascii')
TypeError: 'Column' object is not callable
是否有替代方法来完成此操作,感谢您对此的任何帮助。
这应该有效。
首先创建一个临时示例数据框:
df = spark.createDataFrame([
(0, "This is Spark"),
(1, "I wish Java could use case classes"),
(2, "Data science is cool"),
(3, "This is aSA")
], ["id", "words"])
df.show()
输出
+---+--------------------+
| id| words|
+---+--------------------+
| 0| This is Spark|
| 1|I wish Java could...|
| 2|Data science is ...|
| 3| This is aSA|
+---+--------------------+
现在写一个UDF,因为你使用的那些函数不能直接在列类型上执行,你会得到Column object not callable error
解决方案
from pyspark.sql.functions import udf
def ascii_ignore(x):
return x.encode('ascii', 'ignore').decode('ascii')
ascii_udf = udf(ascii_ignore)
df.withColumn("foo", ascii_udf('words')).show()
输出
+---+--------------------+--------------------+
| id| words| foo|
+---+--------------------+--------------------+
| 0| This is Spark| This is Spark|
| 1|I wish Java could...|I wish Java could...|
| 2|Data science is ...|Data science is ...|
| 3| This is aSA| This is aSA|
+---+--------------------+--------------------+
这个答案对我来说效果很好,但它不喜欢 NULL。我添加了一个小 mod:
def ascii_ignore(x):
if x:
return x.encode('ascii', 'ignore').decode('ascii')
else:
return None
我正在从大约有 50 列的 csv 文件中读取数据,其中少数列(4 到 5)包含具有非 ASCII 字符和特殊字符的文本数据。
df = spark.read.csv(path, header=True, schema=availSchema)
我正在尝试删除所有非 Ascii 字符和特殊字符,只保留英文字符,我尝试按如下方式进行操作
df = df['textcolumn'].str.encode('ascii', 'ignore').str.decode('ascii')
我的列名中没有空格。我收到一个错误
TypeError: 'Column' object is not callable
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<command-1486957561378215> in <module>
----> 1 InvFilteredDF = InvFilteredDF['SearchResultDescription'].str.encode('ascii', 'ignore').str.decode('ascii')
TypeError: 'Column' object is not callable
是否有替代方法来完成此操作,感谢您对此的任何帮助。
这应该有效。
首先创建一个临时示例数据框:
df = spark.createDataFrame([
(0, "This is Spark"),
(1, "I wish Java could use case classes"),
(2, "Data science is cool"),
(3, "This is aSA")
], ["id", "words"])
df.show()
输出
+---+--------------------+
| id| words|
+---+--------------------+
| 0| This is Spark|
| 1|I wish Java could...|
| 2|Data science is ...|
| 3| This is aSA|
+---+--------------------+
现在写一个UDF,因为你使用的那些函数不能直接在列类型上执行,你会得到Column object not callable error
解决方案
from pyspark.sql.functions import udf
def ascii_ignore(x):
return x.encode('ascii', 'ignore').decode('ascii')
ascii_udf = udf(ascii_ignore)
df.withColumn("foo", ascii_udf('words')).show()
输出
+---+--------------------+--------------------+
| id| words| foo|
+---+--------------------+--------------------+
| 0| This is Spark| This is Spark|
| 1|I wish Java could...|I wish Java could...|
| 2|Data science is ...|Data science is ...|
| 3| This is aSA| This is aSA|
+---+--------------------+--------------------+
这个答案对我来说效果很好,但它不喜欢 NULL。我添加了一个小 mod:
def ascii_ignore(x):
if x:
return x.encode('ascii', 'ignore').decode('ascii')
else:
return None