복붙노트

[HADOOP] Pig Latin의 STRSPLIT 및 REGEX_EXTRACT_ALL

HADOOP

Pig Latin의 STRSPLIT 및 REGEX_EXTRACT_ALL

다음 파일이 있습니다.

File
----
12-3    John    121
 5-1    Sam     122

파일은 탭 (\ t)으로 구분됩니다. 개별 필드에서 데이터가 분할되지 않도록 행을 행 : chararray로로드하고 있습니다.

이제 세부 정보 (12-3 및 5-1)를 별도의 데이터로 가져와 저장하고 싶습니다.

STRSPLIT 및 REGEX_EXTRACT_ALL로 시도하고 있지만 데이터가 일치하지 않는 것 같습니다.

splitdata = FOREACH filedata {
    regex = REGEX_EXTRACT_ALL(line, '^([0-9]*)\\-([0-9]*)');
    split = STRSPLIT(line, '\\t', 1);
    GENERATE regex, split;
};

이것이 내가 최종 데이터를 원하는 방식입니다.

(12, 3, 12-3    John    121)
( 5, 1,  5-1    Sam     122)

해결법

  1. ==============================

    1.이건 어떤가요:

    이건 어떤가요:

    A = LOAD .... AS (line:chararray);
    B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^(.*)\t(.*)\t(.*)$')) 
          AS (id:chararray, name:chararray, nameid:chararray);
    C = FOREACH B GENERATE FLATTEN(REGEX_EXTRACT_ALL(id, '^([0-9]*)\\-([0-9]*)')), 
          id, name, nameid;
    STORE C INTO ...
    

    로드 할 때 행을 \ t를 따라 필드로 분할하면 B = ...를 건너 뛸 수 있습니다.

  2. ==============================

    2.감사합니다 Lorand.

    감사합니다 Lorand.

    REGEX_EXTRACT_ALL을 사용하는 방법에 대해 약간의 아이디어를 주었으므로 여기에 마지막으로 사용한 방법이 있습니다.

    FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, '^([0-9]*)\\-([0-9]*).*')) 
      AS (FIELD1:chararray, FIELD2:chararray), line;
    

    Matcher.matches ()는 '^ ([0-9] *) \\-([0-9] *)'에 대해 실패하지만 '^ ([0-9] *) \\- ([0-9] *). * '.

  3. from https://stackoverflow.com/questions/13396778/strsplit-and-regex-extract-all-in-piglatin by cc-by-sa and MIT license