在Linux上扫描文本文件以进行质量检查(模式匹配)的最佳实践是什么?

时间:2019-02-13 19:34:18

标签: linux csv hdfs

我们从客户端收到了要在Hadoop中处理的数据,第一件事是数据将以CSV格式作为文件存储在linus上。通常,这些文件是好的,但是,我们发现有几行数据不正确的情况-这导致整个处理在上一个审核阶段被拒绝。

因此,确实需要在数据到达之后和将其提取到管道之前进行一些数据质量检查。

数据大小从MB到GB,从数千行到数十亿行不等。

什么是最好的方法?以下是当前的想法: 1.使用诸如awk或grep,...之类的linux命令来过滤掉模式不匹配的行; 2.编写自定义的python脚本以过滤掉模式不匹配的行;

是的,也可以在Spark中检查数据,但是,我们认为一开始就应从管道中排除不良数据。

欢迎与您分享任何内容。

理想情况下,该解决方案可以应用于文件系统(Linux)上的文本文件以及HDFS上的现有数据。

更新:

以下示例数据: 猫sample.txt

$~$TRN_FILE_DT$~$|$~$TRN_BANK_STATE_ID$~$|$~$ACCT_NUM_FULL$~$|$~$TRN_TRANSACTION_CD$~$|$~$TRN_TRANSACTION_DT$~$|$~$TRN_TRANSACTION_AMT$~$|$~$TRN_BAT_NUM$~$|$~$TRN_SEQ_NUM$~$|$~$TRN_LOCUSORTYPE$~$|$~$TRN_CITYST$~$|$~$TRN_PURPOSE$~$|$~$TRN_ATM_LOC_CD$~$|$~$TRN_AMT_LOC_ON_US$~$|$~$TRN_AMT_REMOTE_BR$~$|$~$TRN_ATM_GL_RC$~$|$~$TRN_POST_SEQ$~$|$~$TRN_POSTING_PRIORITY$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xBFACD988EAF6ABE515C16CE33C10F0860B33C83D$~$|$~$0129$~$|$~$2018-12-31 00:00:00$~$|$~$1425.00$~$|$~$5912 $~$|$~$13312$~$|$~$TO CHECKING$~$|$~$$~$|$~$TO CHECKING$~$|$~$$~$|$~$$~$|$~$$~$|$~$$~$|$~$00001$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0170$~$|$~$2018-12-31 00:00:00$~$|$~$3503.71$~$|$~$7200 $~$|$~$90542$~$|$~$Morgan Stanley$~$|$~$$~$|$~$ACH CREDIT$~$|$~$$~$|$~$$~$|$~$$~$|$~$$~$|$~$00001$~$|$~$20$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$34.00$~$|$~$8888 $~$|$~$51279$~$|$~$Village Nails & Sp$~$|$~$CRANSTON     RI$~$|$~$DBT PURCHASE$~$|$~$7230$~$|$~$$~$|$~$$~$|$~$$~$|$~$00001$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$||$~$001$~$||$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$91.94$~$|$~$8888 $~$|$~$42283$~$|$~$AMZN Mktp US*M26ZY$~$|$~$Amzn.com/billWA$~$|$~$DBT PURCHASE$~$|$~$5942$~$|$~$$~$|$~$$~$|$~$$~$|$~$00002$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$75.19$~$|$~$8888 $~$|$~$66089$~$|$~$P.J.'S PUB$~$|$~$NARRAGANSETT RI$~$|$~$DBT PURCHASE$~$|$~$5812$~$|$~$$~$|$~$$~$|$~$$~$|$~$00003$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$9.34$~$|$~$8888 $~$|$~$66093$~$|$~$Amazon.com*M26TD1R$~$|$~$Amzn.com/billWA$~$|$~$DBT PURCHASE$~$|$~$5942$~$|$~$$~$|$~$$~$|$~$$~$|$~$00004$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$||$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0135$~$|$~$2018-12-31 00:00:00$~$|$~$57.48$~$|$~$8888 $~$|$~$42285$~$|$~$JOANN STORES #2125$~$|$~$WARWICK      RI$~$|$~$POS DEBIT$~$|$~$5949$~$|$~$$~$|$~$$~$|$~$$~$|$~$00005$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$|0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0135$~$|$~$2018-12-31 00:00:00$~$|$~$7.89$~$|$~$8888 $~$|$~$42287$~$|$~$2740 SOUTH KIN$~$|$~$SOUTH KINGSTORI$~$|$~$POS DEBIT$~$|$~$5541$~$|$~$$~$|$~$$~$|$~$$~$|$~$00006$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$5.92$~$|$~$8888 $~$|$~$66091$~$|$~$AMZN Mktp US*M28O5$~$|$~$Amzn.com/billWA$~$|$~$DBT PURCHASE$~$|$~$5942$~$|$~$$~$|$~$$~$|$~$$~$|$~$00007$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$||$~$001$~$||$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$91.94$~$|$~$8888 $~$|$~$42283$~$|$~$AMZN Mktp US*M26ZY$~$|$~$Amzn.com/billWA$~$|$~$DBT PURCHASE$~$|$~$5942$~$|$~$$~$|$~$$~$|$~$$~$|$~$00002$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$||$~$0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0135$~$|$~$2018-12-31 00:00:00$~$|$~$57.48$~$|$~$8888 $~$|$~$42285$~$|$~$JOANN STORES #2125$~$|$~$WARWICK      RI$~$|$~$POS DEBIT$~$|$~$5949$~$|$~$$~$|$~$$~$|$~$$~$|$~$00005$~$|$~$35$~$
$~$2019-01-01 00:00:00$~$|$~$001$~$|$~$|0xDFC9ACE6A089C648E74524847A7273763475655D$~$|$~$0135$~$|$~$2018-12-31 00:00:00$~$|$~$7.89$~$|$~$8888 $~$|$~$42287$~$|$~$2740 SOUTH KIN$~$|$~$SOUTH KINGSTORI$~$|$~$POS DEBIT$~$|$~$5541$~$|$~$$~$|$~$$~$|$~$$~$|$~$00006$~$|$~$35$~$

在此示例数据中,应该有17个以|分隔的字段,几行中有超过16个|的行,从而创建了17个以上的字段

检查字段数似乎是对原始数据有个快速了解的最有效方法,数据中可能还有其他问题,如果没有解决方案,我将在稍后发布。非常感谢。

2 个答案:

答案 0 :(得分:0)

正如我的评论中所述,我经常使用awk来测试定界符问题。如果您还具有字符串封装字符,这可能会有点难看,但是,如果这不是问题,那就是非常简单的工作:

$ cat testfile.csv
a,1,2,3,4,5,6
b,1,2,3,4,5
c,1,2,3,4,5,6,7
d,1,2,3,4,5,6
e,1,2,3,4,5,6

$ awk -F"," 'BEGIN{fieldcount=7}NF!=fieldcount{print $0>FILENAME"_bad";next}{print $0}' testfile.csv > testfile_good.csv

$ cat testfile.csv_bad
b,1,2,3,4,5
c,1,2,3,4,5,6,7

$ cat testfile_good.csv
a,1,2,3,4,5,6
d,1,2,3,4,5,6
e,1,2,3,4,5,6

答案 1 :(得分:0)

从您的输入开始,使用Miller(http://johnkerl.org/miller/doc/index.html

def main():
    cmd = " cd ../some_path && npm run dev"
    os.system(cmd)
    print("hello world")

这些是每行的字段数

mlr --nidx --fs "|" put '$nf=NF' then cut -f nf then cat -n input

如果您只希望包含17个字段的行

1|17
2|17
3|17
4|17
5|19
6|17
7|17
8|18
9|18
10|17
11|19
12|18
13|18

给你

mlr --nidx --fs "|" put '$nf=NF' then filter '$nf==17' then cut -x -f nf input