验证CSV文件PySpark

时间:2018-11-21 08:41:17

标签: csv apache-spark dataframe pyspark

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

http://www.discussbigdata.com/2018/07/capture-bad-records-while-loading-csv.html

df = spark.read
  .option("badRecordsPath", "/data/badRecPath")
  .parquet("/input/parquetFile")

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

在作为pyspark的一部分进行读取并想将不良记录写入文件时,有什么方法可以找出csv文件中的不良记录。

架构不是静态的,因为我们正在处理多个表数据并且无法对架构进行硬编码。

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

1 个答案:

答案 0 :(得分:3)

我不确定您将哪种记录称为坏记录,因为我们看不到您的输入数据。 根据我的假设,可以说我们有一个下面的输入文件,其中有五列。

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']]

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