Пропуск заголовка при загрузке текстового файла с помощью Piglatin

У меня есть текстовый файл, и это первая строка содержит заголовок. Теперь я хочу сделать некоторую операцию над данными, но при загрузке файла с помощью PigStorage он также берет заголовок. Я просто хочу пропустить заголовок. Возможно ли это сделать(напрямую или через UDF)?

это команда, которую я использую для загрузки данных:

input_file = load '/home/hadoop/smdb_tracedata.csv'
USING PigStorage(',')
as (trans:chararray, carrier:chararray,aainday:chararray);

5 ответов


Если у вас есть свинья версии 0.11, вы могли бы попробовать это:

input_file = load '/home/hadoop/smdb_tracedata.csv' USING PigStorage(',') as (trans:chararray, carrier :chararray,aainday:chararray);

ranked = rank input_file;

NoHeader = Filter ranked by (rank_input_file > 1);

Ordered = Order NoHeader by rank_input_file

New_input_file = foreach Ordered Generate trans, carrier, aainday;

Это избавит от первой строки, оставив New_input_file точно таким же, как и исходный, без строки заголовка (предполагая, что строка заголовка является первой строкой в файле). Обратите внимание, что оператор ранга доступен только в pig 0.11, поэтому, если у вас есть более ранняя версия, вам нужно будет найти другой способ.

Edit: добавлена упорядоченная строка, чтобы убедиться, что New_input_file поддерживает тот же порядок в качестве исходного входного файла


обычно способ решения этой проблемы заключается в использовании фильтра для чего-то, что я знаю, находится в заголовке. Например, рассмотрим следующий пример:

STATE,NAME
MD,Bob
VA,Larry

Я сделаю так:

B = FILTER A BY state != 'STATE';

вот еще один способ сделать это:

  • загрузите полный файл, включая запись заголовка в отношении

    fileAllRecords = LOAD 'csvfilename' using PigStorage(',');
    
  • используйте команду Linux tail для потоковой передачи только записей данных

    fileDataRecords = STREAM fileAllRecords THROUGH `tail -n +2` AS (chararray:f1 ..)
    
  • чтобы убедиться, что запись заголовка удалена, используйте следующую команду -

    firstFewRecords = STREAM fileDataRecords THROUGH `head -20`;
    DUMP firstFewRecords;
    

вы хотите использовать CSVExcelStorage найдено в piggybank. Он позволяет устанавливать параметры для обработки заголовков, окончаний строк, цитируемых полей и других параметров CSV. Конструктор, который вы хотите, доступен только в версиях PIG по крайней мере 0.12 и имеет подпись:

CSVExcelStorage(String delimiter, String multilineTreatmentStr, String eolTreatmentStr, String headerTreatmentStr) 

свин код ниже :

REGISTER /usr/lib/pig/piggybank.jar;

input_file = load '/home/hadoop/smdb_tracedata.csv'
USING CSVExcelStorage(',', 'default', 'NOCHANGE', 'SKIP_INPUT_HEADER')
as (trans:chararray, carrier:chararray,aainday:chararray);

такого рода ошибки обычно возникают при попытке преобразовать несовместимые типы данных. Я столкнулся с аналогичной проблемой и причиной --> файл, который я пытаюсь загрузить, содержит заголовок и отображает ошибку. Другие вероятные причины могут быть наличием NA, пробелов в столбце