在PySpark数据框中删除非ASCII和特殊字符

5

我正在读取包含大约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

有没有其他方法可以实现这个,非常感谢您的帮助。


我的解决方案可行吗? - Rahul P
@RahulP:非常好用,谢谢。我已经点赞了这个答案。我是大数据和Spark的新手,并且从像您这样充满激情的人那里学习 :) - sab
欢迎来到大数据和Spark,谢谢您的支持 :)。如果您认为这个答案是您正在寻找的,请点击“接受”。 - Rahul P
3个回答

11

这应该能够工作。

首先创建一个临时的示例数据框:

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”错误。

解决方案

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|
+---+--------------------+--------------------+

1
非常感谢你,这真是帮了我大忙。在处理那个可怕的零宽不换行空格特殊字符时,节省了我很多时间。 - deesolie
1
非常感谢你帮我解决了这个问题,省了我很多时间,特别是在处理那个令人头疼的零宽不换行空格特殊字符的时候。 - undefined

5
这个答案对我很有用,但它不支持NULL。我做了一个小修改:
def ascii_ignore(x):
  if x:
    return x.encode('ascii', 'ignore').decode('ascii')
  else:
    return None

2

两个答案都非常有用,但我不禁注意到我们可以只需添加udf作为装饰器,就能更加符合Python的风格。

from pyspark.sql.functions import udf

@udf
def ascii_ignore(x):
    return x.encode('ascii', 'ignore').decode('ascii') if x else None

df.withColumn("foo", ascii_ignore('words')).limit(5).show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接