验证CSV文件PySpark

验证CSV文件PySpark,csv,apache-spark,dataframe,pyspark,Csv,Apache Spark,Dataframe,Pyspark,我正在尝试验证csv文件(每条记录的列数)。根据下面的链接,在Databricks 3.0中有处理它的选项 但是,我使用的是2.3 spark版本,无法使用该选项 作为pyspark的一部分进行读取时,是否有任何方法可以找出csv文件中的不良记录,并希望将不良记录写入文件 模式不是静态的,因为我们正在处理多个表数据,不能硬编码模式 df = spark.read.option("wholeFile", "true"). \ opt

我正在尝试验证csv文件(每条记录的列数)。根据下面的链接,在Databricks 3.0中有处理它的选项

但是,我使用的是2.3 spark版本,无法使用该选项

作为pyspark的一部分进行读取时,是否有任何方法可以找出csv文件中的不良记录,并希望将不良记录写入文件

模式不是静态的,因为我们正在处理多个表数据,不能硬编码模式

        df = spark.read.option("wholeFile", "true"). \
                        option("header", "true"). \
                        option("quote", "\""). \
                        csv("${table}/path/to/csv/file")

我不确定您所指的坏记录是哪种类型的记录,因为我们无法看到您的输入数据。 基于我的假设,假设我们有一个包含五列的输入文件

col1,col2,col3,col4,col5
1,ABC,YYY,101,USA
2,ABC,ZZZ,102,USA
3,ABC,,,USA
4,ABC,GGG,104,USA
5,ABC,PPP,105
第3行的空列较少,第5行的空列较少。因此,我不想在数据帧中加载这两条记录

PATH_TO_FILE = "file:///user/vikrant/hivespark/userinput"

df = sc.textFile(PATH_TO_FILE)\
           .mapPartitions(lambda line: csv.reader(line,delimiter=',', quotechar='"'))\
           .map(lambda x: [i for i in x if len(i)!= 0]) \
           .filter(lambda line: len(line) > 4 and line[0] != 'col1') \
           .toDF(['Col1','Col2','Col3','Col4','Col5'])


>>> df.show();
+----+----+----+----+----+
|Col1|Col2|Col3|Col4|Col5|
+----+----+----+----+----+
|   1| ABC| YYY| 101| USA|
|   2| ABC| ZZZ| 102| USA|
|   4| ABC| GGG| 104| USA|
+----+----+----+----+----+
如果要从输入文件中提取不良记录:

badrecords = sc.textFile(PATH_TO_FILE)\
           .mapPartitions(lambda line: csv.reader(line,delimiter=',', quotechar='"'))\
           .map(lambda x: [i for i in x if len(i)!= 0]) \
           .filter(lambda line: len(line) < 5 and line[0] != 'col1')

>>> badrecords.take(10)
[['3', 'ABC', 'USA'], ['5', 'ABC', 'PPP', '105']]
badrecords=sc.textFile(路径到文件)\
.mapPartitions(lambda行:csv.reader(行,分隔符=',',引号='))\
.map(λx:[如果len(i)!=0,则i代表x中的i])\
.filter(lambda行:len(行)<5且行[0]!='col1')
>>>坏记录。记下(10)
[3'、[ABC'、[USA']、[5'、[ABC'、[PPP'、[105']]

让我知道它是否对您有用!

如果我尝试运行该代码,它会显示以下错误:“未定义全局名称‘csv’”您能否再指定一点环境以及所需的导入语句?好的,我知道了……只是缺少导入csv语句。
badrecords = sc.textFile(PATH_TO_FILE)\
           .mapPartitions(lambda line: csv.reader(line,delimiter=',', quotechar='"'))\
           .map(lambda x: [i for i in x if len(i)!= 0]) \
           .filter(lambda line: len(line) < 5 and line[0] != 'col1')

>>> badrecords.take(10)
[['3', 'ABC', 'USA'], ['5', 'ABC', 'PPP', '105']]