我正在尝试验证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")
答案 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']]
让我知道它是否对您有用或有帮助!