Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用pyspark如何拒绝csv文件中的坏(格式错误)记录并将这些被拒绝的记录保存到新文件中_Apache Spark_Pyspark_Pyspark Sql - Fatal编程技术网

Apache spark 使用pyspark如何拒绝csv文件中的坏(格式错误)记录并将这些被拒绝的记录保存到新文件中

Apache spark 使用pyspark如何拒绝csv文件中的坏(格式错误)记录并将这些被拒绝的记录保存到新文件中,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我正在使用pyspark将csv文件中的数据加载到数据框中,我能够在删除格式错误的记录的同时加载数据,但如何从csv文件中拒绝这些不良(格式错误)的记录并将这些被拒绝的记录保存到新文件中?这里有一个想法,尽管我对此不太满意。正如您所知,CSV解析器有不同的模式来删除格式错误的数据。但是,如果未指定任何模式,则会使用默认的null值“填充空白”。你可以利用这个优势 使用此数据,并假设列article\u id在设计上不可为空: 1,abcd,correct record1,description1

我正在使用pyspark将csv文件中的数据加载到数据框中,我能够在删除格式错误的记录的同时加载数据,但如何从csv文件中拒绝这些不良(格式错误)的记录并将这些被拒绝的记录保存到新文件中?

这里有一个想法,尽管我对此不太满意。正如您所知,CSV解析器有不同的模式来删除格式错误的数据。但是,如果未指定任何模式,则会使用默认的
null
值“填充空白”。你可以利用这个优势

使用此数据,并假设列
article\u id
在设计上不可为空:

1,abcd,correct record1,description1 haha
Bad record,Bad record description
3,hijk,another correct record,description2
Not_An_Integer,article,no integer type,description
代码如下:

#!/usr/bin/env python
# coding: utf-8

import pyspark
from pyspark.sql.types import *
from pyspark.sql import Row, functions as F

sc = pyspark.SparkContext.getOrCreate()
spark = pyspark.sql.SparkSession(sc)

# Load the data with your schema, drop the malformed information
schema = StructType([ StructField("article_id", IntegerType()), 
                     StructField("title", StringType()), 
                     StructField("short_desc", StringType()), 
                     StructField("article_desc", StringType())]) 
valid_data = spark.read.format("csv").schema(schema).option("mode","DROPMALFORMED").load("./data.csv")
valid_data.show()

"""
+----------+-----+--------------------+-----------------+
|article_id|title|          short_desc|     article_desc|
+----------+-----+--------------------+-----------------+
|         1| abcd|     correct record1|description1 haha|
|         3| hijk|another correct r...|     description2|
+----------+-----+--------------------+-----------------+
"""

# Load the data and let spark infer everything
malformed_data = spark.read.format("csv").option("header", "false").load("./data.csv")
malformed_data.show()

"""
+--------------+--------------------+--------------------+-----------------+
|           _c0|                 _c1|                 _c2|              _c3|
+--------------+--------------------+--------------------+-----------------+
|             1|                abcd|     correct record1|description1 haha|
|    Bad record|Bad record descri...|                null|             null|
|             3|                hijk|another correct r...|     description2|
|Not_An_Integer|             article|     no integer type|      description|
+--------------+--------------------+--------------------+-----------------+
"""

# Join and keep all data from the 'malformed' DataFrame.
merged = valid_data.join(malformed_data, on=valid_data.article_id == malformed_data._c0, how="right")

# Filter those records for which a matching with the 'valid' data was not possible
malformed = merged.where(F.isnull(merged.article_id))
malformed.show()

"""
+----------+-----+----------+------------+--------------+--------------------+---------------+-----------+
|article_id|title|short_desc|article_desc|           _c0|                 _c1|            _c2|        _c3|
+----------+-----+----------+------------+--------------+--------------------+---------------+-----------+
|      null| null|      null|        null|    Bad record|Bad record descri...|           null|       null|
|      null| null|      null|        null|Not_An_Integer|             article|no integer type|description|
+----------+-----+----------+------------+--------------+--------------------+---------------+-----------+
"""

我不太喜欢这个,因为它对Spark解析CSV的方式非常敏感,它可能不适用于所有文件,但您可能会发现它很有用。

它的可能重复不是重复,因为我需要将坏记录拒绝到新文件中(以识别这些坏记录),而不是仅仅删除坏记录库,我的坏记录。我想我可能对这个案子有个想法。你能发布几条正确和错误的记录吗?这是我处理的示例数据:1,abcd,正确记录1,描述1哈哈,efgh,坏记录,坏记录描述3,hijk,另一条正确记录,描述2很多,这将非常有用,尽管有点模糊:-)我要求这样的功能: