【问题标题】:Remove special characters from csv data using Spark使用 Spark 从 csv 数据中删除特殊字符
【发布时间】:2019-10-22 11:57:27
【问题描述】:

我想使用 PySpark 从 csv 数据中删除特定的(例如@、&)特殊字符。我已经通过了 optimuspyspark(https://github.com/ironmussa/Optimus)。但是它正在删除所有特殊字符。我想使用 Spark 从 CSV 数据中删除特定的特殊字符。是否有任何内置函数或自定义函数或第三方库来实现此功能。提前致谢。

我尝试了几个链接:

https://community.hortonworks.com/questions/49802/escaping-double-quotes-in-spark-dataframe.html

【问题讨论】:

  • 使用带有udf的正则表达式

标签: csv apache-spark pyspark


【解决方案1】:

希望这是您正在寻找的:

假设您有一个简单的 csv 文件(2 行),如下所示:

@A 234, 'B' 225, 'C' !556
@D 235, 'E' 2256, 'F'! 557

将 csv 读入数据框:

df=spark.read.csv('test1.csv',mode="DROPMALFORMED",\
                  inferSchema=True,\
                  header = False)

df.show()

+------+---------+---------+
|   _c0|      _c1|      _c2|
+------+---------+---------+
|@A 234|  'B' 225| 'C' !556|
|@D 235| 'E' 2256| 'F'! 557|
+------+---------+---------+

使用 pyspark 函数删除特定的不需要的字符

from pyspark.sql.functions import *
newDf = df.withColumn('_c0', regexp_replace('_c0', '@', ''))\
          .withColumn('_c1', regexp_replace('_c1', "'", ''))\
          .withColumn('_c2', regexp_replace('_c2', '!', ''))

newDf.show()

+-----+-------+--------+
|  _c0|    _c1|     _c2|
+-----+-------+--------+
|A 234|  B 225| 'C' 556|
|D 235| E 2256| 'F' 557|
+-----+-------+--------+

如果您想从所有列中删除特定字符,请尝试以下操作

从与上面相同的简化文本文件/数据帧开始:

+------+---------+---------+
|   _c0|      _c1|      _c2|
+------+---------+---------+
|@A 234|  'B' 225| 'C' !556|
|@D 235| 'E' 2256| 'F'! 557|
+------+---------+---------+

从数据框中的列中删除字符的函数:

def cleanColumn(tmpdf,colName,findChar,replaceChar):
    tmpdf = tmpdf.withColumn(colName, regexp_replace(colName, findChar, replaceChar))
    return tmpdf

从 df 的 ALL 列中删除“'”字符(替换为空,即“”)

allColNames = df.schema.names
charToRemove= "'"
replaceWith =""
for colName in allColNames:
    df=cleanColumn(df,colName,charToRemove,replaceWith)

结果输出是:

df.show()
+------+-------+-------+
|   _c0|    _c1|    _c2|
+------+-------+-------+
|@A 234|  B 225| C !556|
|@D 235| E 2256| F! 557|
+------+-------+-------+

【讨论】:

  • 感谢您的回复。我想将正则表达式应用于所有列(因为有 100 列并且架构经常变化)而不指定列名。请有任何建议。
  • 不客气。我添加了一些代码,允许从数据框中的所有列中删除一个字符 - 希望这会有所帮助。
【解决方案2】:

使用 Optimus,您可以:

df.cols.replace("*",["a","b","c"]," ").table()

  • 使用开始选择所有列。
  • 传递一个包含您要匹配的元素的数组
  • 将替换匹配的字符。在这种情况下为空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-22
    • 2014-05-15
    • 2023-03-25
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2011-08-29
    • 2020-01-12
    相关资源
    最近更新 更多