使用Spark从csv数据中删除特殊字符

时间:2018-02-14 10:52:17

标签: csv apache-spark pyspark

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

我尝试了几个链接:

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

2 个答案:

答案 0 :(得分:2)

希望这就是你要找的东西:

假设您有一个简单的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|
+-----+-------+--------+

如果要从所有列中删除特定字符,请尝试以下

从与上面相同的简化textfile / dataFrame开始:

+------+---------+---------+
|   _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 列中删除“\ n”字符(替换为无“ie”)

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

答案 1 :(得分:0)

借助擎天柱,您可以:

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

  • 从头开始选择所有列。
  • 传递带有要匹配元素的数组
  • 将替换匹配项的字符。在这种情况下为空白。