Как лучше сканировать текстовый файл в Linux для проверки качества (сопоставления с шаблоном)? - PullRequest
0 голосов
/ 13 февраля 2019

Мы получили данные от клиентов для обработки в Hadoop, во-первых, данные поступят в виде файла на linus в формате csv.Обычно файлы хороши, однако мы видели случаи, когда в нескольких строках содержались неверные данные - это приводило к тому, что вся обработка была отклонена на последнем этапе аудита.

Так что действительно нужно сделать некоторыепроверка качества данных после поступления данных и до их поступления в конвейер.

Размер данных варьируется от МБ до ГБ, от тысяч строк до миллиарда + строк.

Каков наилучший способсделай это?Следующие идеи являются актуальными: 1. использование команды linux, такой как awk или grep, ..., для фильтрации несогласованных линий шаблона;2. написание настраиваемого скрипта Python для фильтрации несогласованных линий шаблона;

Да, данные также можно проверять в Spark, однако мы считаем, что плохие данные должны быть исключены из конвейера в начале.

Любой обмен здесь приветствуется и приветствуется.

В идеале решение может быть применено к текстовому файлу в файловой системе (Linux), а также к существующим данным в HDFS.

ОБНОВЛЕНИЕ:

Пример данных ниже: cat 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 голосов
/ 14 февраля 2019

Начиная с вашего ввода, используя Миллера (http://johnkerl.org/miller/doc/index.html)

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

- это количество полей в строке

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

Если вы хотите, чтобы строки были только с 17 полями

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

дает вам

$~$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$~$|$~$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$~$|$~$0136$~$|$~$2018-12-31 00:00:00$~$|$~$5.92$~$|$~$8888 $~$|$~$66091$~$|$~$AMZN Mktp US*M28O5$~$|$~$Amzn.com/billWA$~$|$~$DBT PURCHASE$~$|$~$5942$~$|$~$$~$|$~$$~$|$~$$~$|$~$00007$~$|$~$35$~$
0 голосов
/ 14 февраля 2019

Как объяснено в моем комментарии, я часто использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...