【问题标题】:Removing non-ascii and special character in pyspark dataframe column删除 pyspark 数据框列中的非 ascii 和特殊字符
【发布时间】:2020-05-14 08:46:20
【问题描述】:

我正在从大约 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

是否有替代方法来完成此操作,感谢任何帮助。

【问题讨论】:

  • 我的解决方案有效吗?
  • @RahulP:像宝石一样工作。非常感谢。我赞成这个答案。我是大数据和火花的新手,向像你这样充满激情的人学习:)
  • 欢迎来到大数据和火花,谢谢 :) 。如果您觉得答案正是您要找的,请您“接受”它吗?

标签: python pyspark apache-spark-sql pyspark-sql azure-databricks


【解决方案1】:

这应该可行。

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

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

【讨论】:

    【解决方案2】:

    这个答案对我来说效果很好,但它不喜欢 NULL。我添加了一个小模组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2020-06-30
      相关资源
      最近更新 更多