Spec-Zone.ru › Apache Pig 0.14

Встроенные функции

  • Введение
  • Динамические вызыватели
  • Функции Eval
    • AVG
    • BagToString
    • CONCAT
    • COUNT
    • COUNT_STAR
    • DIFF
    • IsEmpty
    • MAX
    • MIN
    • PluckTuple
    • SIZE
    • SUBTRACT
    • SUM
    • TOKENIZE
  • Функции загрузки/хранения
    • Обработка сжатия
    • BinStorage
    • JsonLoader, JsonStorage
    • PigDump
    • PigStorage
    • TextLoader
    • HBaseStorage
    • AvroStorage
    • TrevniStorage
    • AccumuloStorage
    • OrcStorage
  • Математические функции
    • ABS
    • ACOS
    • ASIN
    • ATAN
    • CBRT
    • CEIL
    • COS
    • COSH
    • EXP
    • FLOOR
    • LOG
    • LOG10
    • RANDOM
    • ROUND
    • ROUND_TO
    • SIN
    • SINH
    • SQRT
    • TAN
    • TANH
  • Строковые функции
    • ENDSWITH
    • EqualsIgnoreCase
    • INDEXOF
    • LAST_INDEX_OF
    • LCFIRST
    • LOWER
    • LTRIM
    • REGEX_EXTRACT
    • REGEX_EXTRACT_ALL
    • REPLACE
    • RTRIM
    • SPRINTF
    • STARTSWITH
    • STRSPLIT
    • STRSPLITTOBAG
    • SUBSTRING
    • TRIM
    • UCFIRST
    • UPPER
    • UniqueID
  • Функции работы со временем
    • AddDuration
    • CurrentTime
    • DaysBetween
    • GetDay
    • GetHour
    • GetMilliSecond
    • GetMinute
    • GetMonth
    • GetSecond
    • GetWeek
    • GetWeekYear
    • GetYear
    • HoursBetween
    • MilliSecondsBetween
    • MinutesBetween
    • MonthsBetween
    • SecondsBetween
    • SubtractDuration
    • ToDate
    • ToMilliSeconds
    • ToString
    • ToUnixTime
    • WeeksBetween
    • YearsBetween
  • Функции кортежей, мешков и словарей
    • TOTUPLE
    • TOBAG
    • TOMAP
    • TOP

Введение

Pig предоставляет набор встроенных функций (функции eval, загрузки/хранения, математические, строковые, мешков и кортежей). Две основные характеристики отличают встроенные функции от пользовательских функций (UDFs). Во-первых, встроенные функции не требуют регистрации, потому что Pig знает, где они находятся. Во-вторых, встроенные функции не требуют квалификации при использовании, потому что Pig знает, где их найти.

Динамические вызыватели

Часто требуется использовать простую функцию, уже предоставляемую стандартными Java-библиотеками, но для которой не была написана пользовательская функция (UDF). Динамические вызыватели позволяют ссылаться на Java-функции без необходимости обертывания их в пользовательские UDF, за счет выполнения Java-рефлексии при каждом вызове функции.

...
DEFINE UrlDecode InvokeForString('java.net.URLDecoder.decode', 'String String'); 
encoded_strings = LOAD 'encoded_strings.txt' as (encoded:chararray); 
decoded_strings = FOREACH encoded_strings GENERATE UrlDecode(encoded, 'UTF-8'); 
...

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

  • Не принимают аргументы или принимают комбинацию строк, целых чисел, длинных целых чисел, двойных или плавающих чисел или массивов с этими же типами
  • Возвращают строку, целое число, длинное целое число, двойное или плавающее число

Только примитивные типы могут использоваться для чисел; числовые классы с заглавными буквами не могут использоваться в качестве аргументов. В зависимости от типа возвращаемого значения необходимо использовать определенный тип вызывателя: InvokeForString, InvokeForInt, InvokeForLong, InvokeForDouble или InvokeForFloat.

Оператор DEFINE используется для привязки ключевого слова к Java-методу, как указано выше. Первый аргумент конструктора InvokeFor* — это полный путь к нужному методу. Второй аргумент — это разделенный пробелами упорядоченный список типов аргументов метода. Он может быть опущен или быть пустой строкой, если метод не принимает аргументов. Допустимые имена классов — string, long, float, double и int. Вызыватели также могут работать с массивами аргументов, представленными в Pig как DataBags элементов однократного кортежа. Например, просто укажите string[]. Имена классов не чувствительны к регистру.

Возможность использования вызывателей для методов, принимающих массивы аргументов, делает доступными методы из org.apache.commons.math.stat.StatUtils (например, для обработки результатов группировки наборов данных). Это полезно, но стоит предостеречь: получившийся UDF не будет оптимизирован для Hadoop, и значительные преимущества от реализации интерфейсов Algebraic и Accumulator будут утрачены. Будьте осторожны, если используете вызыватели таким образом.

Функции Eval

СРЗНАЧ

Вычисляет среднее арифметическое числовых значений в одностолбцовой сумме.

Синтаксис

СРЗНАЧ(выражение)

Термины

выражение

Любое выражение, результат которого — сумма. Элементы суммы должны иметь тип данных int, long, float, double, bigdecimal, biginteger или bytearray.

Применение

Используйте функцию СРЗНАЧ для вычисления среднего арифметического числовых значений в одностолбцовой сумме. СРЗНАЧ требует предшествующего оператора GROUP ALL для глобальных средних значений и оператора GROUP BY для средних значений групп.

Функция СРЗНАЧ игнорирует значения NULL.

Пример

В этом примере вычисляется средняя оценка GPA для каждого студента (см. оператор GROUP для получения информации о именах полей в отношении B).

A = LOAD 'student.txt' AS (name:chararray, term:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

C = FOREACH B GENERATE A.name, AVG(A.gpa);

DUMP C;
({(John),(John),(John),(John)},3.850000023841858)
({(Mary),(Mary),(Mary),(Mary)},3.925000011920929)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

bytearray

СРЗНАЧ

long

long

double

double

bigdecimal *

bigdecimal *

ошибка

приведение к double

* Средние значения для типов bigdecimal и biginteger имеют точность java.math.MathContext.DECIMAL128.

BagToString

Объединяет элементы суммы в строку chararray, размещая необязательный разделитель между каждым значением.

Синтаксис

BagToString(vals:bag [, delimiter:chararray])

Термины

vals

Сумма произвольных значений. Они будут принудительно преобразованы к chararray, если они не являются таковыми.

delimiter

Значение chararray для размещения между элементами суммы; по умолчанию используется нижнее подчеркивание '_'.

Применение

BagToString создаёт одну строку из элементов суммы, аналогично функции SQL GROUP_CONCAT. Следует иметь в виду следующее:

  • Суммы могут иметь произвольный размер, в то время как строки в Java не могут: вы либо исчерпаете доступную память, либо превысите максимальное количество символов (около 2 миллиардов). Одна из худших особенностей производственной задачи — пороговое поведение: всё будет казаться почти в порядке, пока размер данных вашей самой большой суммы не вырастет от почти-слишком-большого до просто-чуть-слишком-большого.
  • Суммы не упорядочены, если вы явно не примените вложенную операцию ORDER BY, как показано ниже. Вложенный FOREACH сохранит порядок, позволяя вам упорядочивать по одному набору полей, а затем проектировать только те значения, которые вам нужны для конкатенации.
  • Применяется преобразование в строку по умолчанию для каждого элемента. Если элементы суммы не являются атомами (кортежи, карты и т.д.), это может не быть тем, что вы хотите. Используйте вложенный FOREACH для форматирования значений, а затем объедините их с BagToString, как показано ниже.

Примеры:

vals delimiter BagToString(vals, delimiter) Примечания
{('BOS'),('NYA'),('BAL')} BOS_NYA_BAL Если указан только один аргумент, поле разделяются символами нижнего подчеркивания
{('BOS'),('NYA'),('BAL')} '|' BOS|NYA|BAL Но вы можете указать свой собственный разделитель
{('BOS'),('NYA'),('BAL')} '' BOSNYABAL Используйте явную пустую строку, чтобы просто склеить всё вместе
{(1),(2),(3)} '|' 1|2|3 Элементы преобразуются для вас в тип (но см. примеры ниже)

Примеры

Простые строковые значения с разделителями простые:

team_parks = LOAD 'team_parks' AS (team_id:chararray, park_id:chararray, years:bag{(year_id:int)});

-- BOS     BOS07   {(1995),(1997),(1996),(1998),(1999)}
-- NYA     NYC16   {(1995),(1999),(1998),(1997),(1996)}
-- NYA     NYC17   {(1998)}
-- SDN     HON01   {(1997)}
-- SDN     MNT01   {(1996),(1999)}
-- SDN     SAN01   {(1999),(1997),(1998),(1995),(1996)}

team_parkslist = FOREACH (GROUP team_parks BY team_id) GENERATE
  group AS team_id, BagToString(team_parks.park_id, ';');

-- BOS     BOS07
-- NYA     NYC17;NYC16
-- SDN     SAN01;MNT01;HON01

Обработка сложных элементов по умолчанию работает, но, вероятно, не то, что вам нужно.

team_parkyearsugly = FOREACH (GROUP team_parks BY team_id) GENERATE
  group AS team_id,
  BagToString(team_parks.(park_id, years));

-- BOS     BOS07_{(1995),(1997),(1996),(1998),(1999)}
-- NYA     NYC17_{(1998)}_NYC16_{(1995),(1999),(1998),(1997),(1996)}
-- SDN     SAN01_{(1999),(1997),(1998),(1995),(1996)}_MNT01_{(1996),(1999)}_HON01_{(1997)}

Вместо этого соберите всё по частям. На шаге 2 мы сортируем по одному полю, но обрабатываем другое; он остаётся в отсортированном порядке.

team_park_yearslist = FOREACH team_parks {
  years_o = ORDER years BY year_id;
  GENERATE team_id, park_id, SIZE(years_o) AS n_years, BagToString(years_o, '/') AS yearslist;
};
team_parkyearslist = FOREACH (GROUP team_park_yearslist BY team_id) {
  tpy_o = ORDER team_park_yearslist BY n_years DESC, park_id ASC;
  tpy_f = FOREACH tpy_o GENERATE CONCAT(park_id, ':', yearslist);
  GENERATE group AS team_id, BagToString(tpy_f, ';');
  };

-- BOS     BOS07:1995/1996/1997/1998/1999
-- NYA     NYC16:1995/1996/1997/1998/1999;NYC17:1998
-- SDN     SAN01:1995/1996/1997/1998/1999;MNT01:1996/1999;HON01:1997

СОЕДИНЕНИЕ

Объединяет два или более выражений одинакового типа.

Синтаксис

CONCAT (выражение, выражение, [...выражение])

Термины

выражение

Любое выражение.

Применение

Используйте функцию CONCAT для объединения двух или более выражений. Результаты выражений должны иметь одинаковые типы.

Если любое подвыражение равно null, то результирующее выражение равно null.

Пример

В этом примере поля f1, строковая литерал с подчеркиванием, f2 и f3 объединяются.

A = LOAD 'data' as (f1:chararray, f2:chararray, f3:chararray);

DUMP A;
(apache,open,source)
(hadoop,map,reduce)
(pig,pig,latin)

X = FOREACH A GENERATE CONCAT(f1, '_', f2,f3);

DUMP X;
(apache_opensource)
(hadoop_mapreduce)
(pig_piglatin)

СЧЕТ

Вычисляет количество элементов в сумме.

Синтаксис

СЧЕТ(выражение)

Термины

выражение

Выражение с типом данных сумма.

Применение

Используйте функцию СЧЕТ для вычисления количества элементов в сумме. СЧЕТ требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов групп.

Функция СЧЕТ следует синтаксическим правилам и игнорирует значения null. Это означает, что кортеж в сумме не будет учтён, если ПЕРВОЕ ПОЛЕ этого кортежа равно NULL. Если вы хотите включить значения NULL в вычисление подсчёта, используйте СЧЕТ_ЗВЁЗД.

Примечание: Вы не можете использовать обозначение кортежа (*) с СЧЕТОМ; то есть СЧЕТ(*) не будет работать.

Пример

В этом примере подсчитываются кортежи в сумме (см. оператор GROUP для получения информации о именах полей в отношении B).

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A;
(1,2,3)
(4,2,1)
(8,3,4)
(4,3,3)
(7,2,5)
(8,4,3)

B = GROUP A BY f1;

DUMP B;
(1,{(1,2,3)})
(4,{(4,2,1),(4,3,3)})
(7,{(7,2,5)})
(8,{(8,3,4),(8,4,3)})

X = FOREACH B GENERATE COUNT(A);

DUMP X;
(1L)
(2L)
(1L)
(2L)

Типы таблиц

int

long

float

double

chararray

bytearray

СЧЕТ

long

long

long

long

long

long

СЧЕТ_ЗВЁЗД

Вычисляет количество элементов в сумме.

Синтаксис

СЧЕТ_ЗВЁЗД(выражение)

Термины

выражение

Выражение с типом данных сумма.

Применение

Используйте функцию СЧЕТ_ЗВЁЗД для вычисления количества элементов в сумме. СЧЕТ_ЗВЁЗД требует предшествующего оператора GROUP ALL для глобальных подсчётов и оператора GROUP BY для подсчётов групп.

СЧЕТ_ЗВЁЗД включает значения NULL в вычисление подсчёта (в отличие от СЧЕТ, который игнорирует значения NULL).

Пример

В этом примере используется СЧЕТ_ЗВЁЗД для подсчёта кортежей в сумме.

X = FOREACH B GENERATE COUNT_STAR(A);

РАЗН

Сравнивает два поля в кортеже.

Синтаксис

РАЗН (выражение, выражение)

Термины

выражение

Выражение с любым типом данных.

Применение

Функция РАЗН принимает две суммы в качестве аргументов и сравнивает их. Любые кортежи, которые присутствуют в одной сумме, но отсутствуют в другой, возвращаются в сумме. Если суммы совпадают, возвращается пустая сумма. Если поля не являются суммами, они будут обернуты в кортежи и возвращены в сумме, если они не совпадают, или возвращается пустая сумма, если два записи совпадают. Реализация предполагает, что обе суммы, передаваемые функции РАЗН, полностью помещаются в память одновременно. Если это не так, UDF всё равно будет работать, но это будет ОЧЕНЬ медленно.

Пример

В этом примере РАЗН сравнивает кортежи в двух суммах.

A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});

DUMP A;
({(8,9),(0,1)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7)},{(2,2),(3,7)})

DESCRIBE A;
a: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}

X = FOREACH A GENERATE DIFF(B1,B2);

grunt> dump x;
({(0,1),(1,1)})
({})
({(6,7),(2,2)})

Пустая

Проверяет, является ли сумма или карта пустой.

Синтаксис

Пустая(выражение)

Термины

выражение

Выражение с любым типом данных.

Применение

Функция Пустая проверяет, является ли сумма или карта пустой (не содержит данных). Функция может использоваться для фильтрации данных.

Пример

В этом примере находятся все студенты с SSN, но без имени.

SSN = load 'ssn.txt' using PigStorage() as (ssn:long);

SSN_NAME = load 'students.txt' using PigStorage() as (ssn:long, name:chararray);

/* do a left outer join of SSN with SSN_Name */
X = JOIN SSN by ssn LEFT OUTER, SSN_NAME by ssn;

/* only keep those ssn's for which there is no name */
Y = filter X by IsEmpty(SSN_NAME);

МАКС

Вычисляет максимальное значение числовых данных или chararrays в одностолбцовом наборе. MAX требует предшествующего оператора GROUP ALL для глобального максимума и оператора GROUP BY для группового максимума.

Синтаксис

MAX(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray.

Использование

Используйте функцию MAX для вычисления максимального значения числовых данных или chararrays в одностолбцовом наборе.

Функция MAX игнорирует значения NULL.

Пример

В этом примере вычисляется максимальное значение GPA для всех периодов обучения каждого студента (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'student' AS (name:chararray, session:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

X = FOREACH B GENERATE group, MAX(A.gpa);

DUMP X;
(John,4.0F)
(Mary,4.0F)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

datetime

bytearray

MAX

int

long

float

double

bigdecimal

biginteger

chararray

datetime

преобразование в double

MIN

Вычисляет минимальное значение числовых данных или chararrays в одностолбцовом наборе. MIN требует предшествующего оператора GROUP… ALL для глобального минимума и оператора GROUP… BY для группового минимума.

Синтаксис

MIN(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger, chararray, datetime или bytearray.

Использование

Используйте функцию MIN для вычисления минимального значения набора числовых данных или chararrays в одностолбцовом наборе.

Функция MIN игнорирует значения NULL.

Пример

В этом примере вычисляется минимальное значение GPA для всех периодов обучения каждого студента (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'student' AS (name:chararray, session:chararray, gpa:float);

DUMP A;
(John,fl,3.9F)
(John,wt,3.7F)
(John,sp,4.0F)
(John,sm,3.8F)
(Mary,fl,3.8F)
(Mary,wt,3.9F)
(Mary,sp,4.0F)
(Mary,sm,4.0F)

B = GROUP A BY name;

DUMP B;
(John,{(John,fl,3.9F),(John,wt,3.7F),(John,sp,4.0F),(John,sm,3.8F)})
(Mary,{(Mary,fl,3.8F),(Mary,wt,3.9F),(Mary,sp,4.0F),(Mary,sm,4.0F)})

X = FOREACH B GENERATE group, MIN(A.gpa);

DUMP X;
(John,3.7F)
(Mary,3.8F)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

datetime

bytearray

MIN

int

long

float

double

bigdecimal

biginteger

chararray

datetime

преобразование в double

PluckTuple

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

Синтаксис

DEFINE pluck PluckTuple(выражение1)

pluck(выражение2)

Термины

выражение1

Префикс для извлечения

выражение2

Поля для применения извлечения, обычно «*»

Использование

Пример:

a = load 'a' as (x, y);
b = load 'b' as (x, y);
c = join a by x, b by x;
DEFINE pluck PluckTuple('a::');
d = foreach c generate FLATTEN(pluck(*));
describe c;
c: {a::x: bytearray,a::y: bytearray,b::x: bytearray,b::y: bytearray}
describe d;
d: {plucked::a::x: bytearray,plucked::a::y: bytearray}

SIZE

Вычисляет количество элементов на основе любого типа данных Pig.

Синтаксис

SIZE(выражение)

Термины

выражение

Выражение с любым типом данных.

Использование

Используйте функцию SIZE для вычисления количества элементов на основе типа данных (см. таблицы типов ниже). SIZE включает значения NULL в вычисление размера. SIZE не является алгебраической функцией.

Если проверяемый объект равен null, функция SIZE возвращает null.

Пример

В этом примере вычисляется количество символов в первом поле.

A = LOAD 'data' as (f1:chararray, f2:chararray, f3:chararray);
(apache,open,source)
(hadoop,map,reduce)
(pig,pig,latin)

X = FOREACH A GENERATE SIZE(f1);

DUMP X;
(6L)
(6L)
(3L)

Типы таблиц

int

возвращает 1

long

возвращает 1

float

возвращает 1

double

возвращает 1

chararray

возвращает количество символов в массиве

bytearray

возвращает количество байтов в массиве

tuple

возвращает количество полей в кортеже

bag

возвращает количество кортежей в наборе

map

возвращает количество пар ключ/значение в карте

SUBTRACT

Вычитание наборов, SUBTRACT(bag1, bag2) = наборы, составленные из элементов bag1, отсутствующих в bag2

Синтаксис

SUBTRACT(выражение, выражение)

Термины

выражение

Выражение с типом данных bag.

Использование

SUBTRACT принимает два набора в качестве аргументов и возвращает новый набор, составленный из кортежей первого набора, отсутствующих во втором наборе.

Если аргументы null, они заменяются пустыми наборами. Если аргументы не являются наборами, возникает исключение IOException.

Реализация предполагает, что оба набора, передаваемые функции SUBTRACT, полностью помещаются в память одновременно. Если это не так, SUBTRACT все равно будет работать, но очень медленно.

Пример

В этом примере SUBTRACT создает новый набор, состоящий из элементов B1, отсутствующих в B2.

A = LOAD 'bag_data' AS (B1:bag{T1:tuple(t1:int,t2:int)},B2:bag{T2:tuple(f1:int,f2:int)});

DUMP A;
({(8,9),(0,1),(1,2)},{(8,9),(1,1)})
({(2,3),(4,5)},{(2,3),(4,5)})
({(6,7),(3,7),(3,7)},{(2,2),(3,7)})

DESCRIBE A;
A: {B1: {T1: (t1: int,t2: int)},B2: {T2: (f1: int,f2: int)}}

X = FOREACH A GENERATE SUBTRACT(B1,B2);

DUMP X;
({(0,1),(1,2)})
({})
({(6,7)})

SUM

Вычисляет сумму числовых значений в одностолбцовом наборе. SUM требует предшествующего оператора GROUP ALL для глобальных сумм и оператора GROUP BY для групповых сумм.

Синтаксис

SUM(выражение)

Термины

выражение

Выражение с типами данных int, long, float, double, bigdecimal, biginteger или bytearray, преобразованные в double.

Использование

Используйте функцию SUM для вычисления суммы набора числовых значений в одностолбцовом наборе.

Функция SUM игнорирует значения NULL.

Пример

В этом примере вычисляется количество домашних животных. (см. оператор GROUP для получения информации о названиях полей в отношении B).

A = LOAD 'data' AS (owner:chararray, pet_type:chararray, pet_num:int);

DUMP A;
(Alice,turtle,1)
(Alice,goldfish,5)
(Alice,cat,2)
(Bob,dog,2)
(Bob,cat,2) 

B = GROUP A BY owner;

DUMP B;
(Alice,{(Alice,turtle,1),(Alice,goldfish,5),(Alice,cat,2)})
(Bob,{(Bob,dog,2),(Bob,cat,2)})

X = FOREACH B GENERATE group, SUM(A.pet_num);
DUMP X;
(Alice,8L)
(Bob,4L)

Типы таблиц

int

long

float

double

bigdecimal

biginteger

chararray

bytearray

SUM

long

long

double

double

bigdecimal

biginteger

ошибка

преобразование в double

TOKENIZE

Разделяет строку и выводит набор слов.

Синтаксис

TOKENIZE(выражение [, 'разделитель_полей'])

Термины

выражение

Выражение с типом данных chararray.

'разделитель_полей'

Необязательный разделитель полей (в одинарных кавычках).

Если разделитель_полей равен null или не передан, в качестве разделителей будут использоваться: пробел [ ], двойная кавычка [ " ], запятая [ , ], скобки [ () ], звездочка [ * ].

Использование

Используйте функцию TOKENIZE для разделения строки слов (все слова в одном кортеже) на набор слов (каждое слово в отдельном кортеже).

Пример

В этом примере строки в каждой строке разделяются.

A  = LOAD 'data' AS (f1:chararray);

DUMP A;
(Here is the first string.)
(Here is the second string.)
(Here is the third string.)

X = FOREACH A GENERATE TOKENIZE(f1);

DUMP X;
({(Here),(is),(the),(first),(string.)})
({(Here),(is),(the),(second),(string.)})
({(Here),(is),(the),(third),(string.)})

В этом примере указан разделитель полей.

{code}
A = LOAD 'data' AS (f1:chararray);
B = FOREACH A TOKENIZE (f1,'||');
DUMP B;
{code} 

Функции загрузки/хранения

Функции загрузки/сохранения определяют, как данные попадают в Pig и выводятся из Pig. Pig предоставляет набор встроенных функций загрузки/сохранения, описанных в разделах ниже. Вы также можете написать свои собственные функции загрузки/сохранения (см. Пользовательские функции).

Обработка сжатия

Поддержка сжатия определяется функцией загрузки/сохранения. PigStorage и TextLoader поддерживают сжатие gzip и bzip как для чтения (загрузки), так и для записи (сохранения). BinStorage не поддерживает сжатие.

Для работы со сжатыми gzip файлами входные/выходные файлы должны иметь расширение .gz. Сжатые gzip файлы нельзя разделять между несколькими картами; это означает, что количество созданных карт равно количеству файлов частей во входном расположении.

A = load ‘myinput.gz’;
store A into ‘myoutput.gz’; 

Для работы со сжатыми bzip файлами входные/выходные файлы должны иметь расширение .bz или .bz2. Поскольку сжатие блочное, bzip файлы могут быть разделены между несколькими картами.

A = load ‘myinput.bz’;
store A into ‘myoutput.bz’; 

Примечание: PigStorage и TextLoader правильно считывают сжатые файлы, если они НЕ являются СЛОЖЕННЫМИ ФАЙЛАМИ, сгенерированными следующим образом:

  • cat *.gz > text/concat.gz

  • cat *.bz > text/concat.bz

  • cat *.bz2 > text/concat.bz2

Если вы используете сложенные gzip или bzip файлы со своими заданиями Pig, вы не увидите ошибки, но результаты будут НЕКОРРЕКТНЫМИ.

BinStorage

Загружает и сохраняет данные в машиночитаемом формате.

Синтаксис

BinStorage()

Термины

нет

нет параметров

Использование

Pig использует BinStorage для загрузки и сохранения временных данных, которые генерируются между несколькими заданиями MapReduce.

  • BinStorage работает с данными, представленными на диске в машиночитаемом формате. BinStorage НЕ поддерживает сжатие.
  • BinStorage поддерживает несколько расположений (файлы, каталоги, шаблоны) в качестве входных данных.

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

Мы видели несколько примеров, когда пользователи делали что-то вроде этого:

a = load 'b.txt' as (id, f);
b = group a by id;
store b into 'g' using BinStorage();

И затем позже:

a = load 'g/part*' using BinStorage() as (id, d:bag{t:(v, s)});
b = foreach a generate (double)id, flatten(d);
dump b;

Существует проблема с этой последовательностью событий. Первый скрипт не определяет типы данных и, в результате, данные хранятся как массив байтов и набор с кортежем, содержащим два массива байтов. Второй скрипт пытается преобразовать массив байтов в двойное значение; однако, поскольку данные были получены из другого загрузчика, он не может знать формат массива байтов или как преобразовать его в другой тип. Для решения этой проблемы Pig:

  • Выводит сообщение об ошибке при выполнении второго скрипта: "Ошибка 1118: Невозможно преобразовать байты, загруженные из BinStorage. Пожалуйста, предоставьте пользовательский преобразователь."
  • Позволяет использовать пользовательский преобразователь для выполнения преобразования.
    a = load 'g/part*' using BinStorage('Utf8StorageConverter') as (id, d:bag{t:(v, s)});
    b = foreach a generate (double)id, flatten(d);
    dump b;
    

Примеры

В этом примере BinStorage используется с функциями LOAD и STORE.

A = LOAD 'data' USING BinStorage();

STORE X into 'output' USING BinStorage(); 

В этом примере BinStorage используется для загрузки нескольких расположений.

A = LOAD 'input1.bin, input2.bin' USING BinStorage();

BinStorage не отслеживает происхождение данных. Когда Pig использует BinStorage для перемещения данных между заданиями MapReduce, Pig может определить правильную функцию преобразования и применить ее. Однако, как показано в примере ниже, когда вы сохраняете данные с помощью BinStorage, а затем используете отдельный скрипт Pig Latin для чтения данных (тем самым теряя информацию о типе), вы несете ответственность за правильное преобразование данных перед сохранением с помощью BinStorage.

raw = load 'sampledata' using BinStorage() as (col1,col2, col3);
--filter out null columns
A = filter raw by col1#'bcookie' is not null;

B = foreach A generate col1#'bcookie'  as reqcolumn;
describe B;
--B: {regcolumn: bytearray}
X = limit B 5;
dump X;
(36co9b55onr8s)
(36co9b55onr8s)
(36hilul5oo1q1)
(36hilul5oo1q1)
(36l4cj15ooa8a)

B = foreach A generate (chararray)col1#'bcookie'  as convertedcol;
describe B;
--B: {convertedcol: chararray}
X = limit B 5;
dump X; 
()
()
()
()
()

JsonLoader, JsonStorage

Загрузка или сохранение данных JSON.

Синтаксис

JsonLoader( [‘схема’] )

JsonStorage( )

Термины

схема

Необязательная схема Pig, в одинарных кавычках.

Использование

Используйте JsonLoader для загрузки данных JSON.

Используйте JsonStorage для сохранения данных JSON.

Обратите внимание, что в JsonLoader и JsonStorage нет понятия разделителя. Данные закодированы в стандартном формате JSON. JsonLoader необязательно принимает схему в качестве аргумента конструкции.

Примеры

В этом примере данные загружаются со схемой.

a = load 'a.json' using JsonLoader('a0:int,a1:{(a10:int,a11:chararray)},a2:(a20:double,a21:bytearray),a3:[chararray]');  

В этом примере данные загружаются без схемы; предполагается, что в каталоге ввода существует .pig_schema (произведенный JsonStorage).

a = load 'a.json' using JsonLoader(); 

PigDump

Сохраняет данные в формате UTF-8.

Синтаксис

PigDump()

Термины

нет

нет параметров

Использование

PigDump сохраняет данные как кортежи в удобочитаемом формате UTF-8.

Пример

В этом примере PigDump используется с функцией STORE.

STORE X INTO 'output' USING PigDump();

PigStorage

Загружает и сохраняет данные как структурированные текстовые файлы.

Синтаксис

PigStorage( [разделитель_полей] , ['опции'] )

Термины

разделитель_полей

По умолчанию разделитель полей - табуляция ('\t').

Вы можете указать другие символы в качестве разделителей полей; однако, убедитесь, что вы заключили символы в одинарные кавычки.

'опции'

Строка, содержащая разделенные пробелами опции (‘optionA optionB optionC’)

В настоящее время поддерживаются следующие опции:

  • (‘схема’) - Сохраняет схему отношения с помощью скрытого JSON-файла.
  • (‘noschema’) - Игнорирует сохраненную схему при загрузке.
  • ('tagsource') - (устарело, используйте tagPath вместо этого) Добавляет первый столбец, указывающий входной файл записи.
  • ('tagPath') - Добавляет первый столбец, указывающий входной путь записи.
  • ('tagFile') - Добавляет первый столбец, указывающий имя входного файла записи.

Использование

PigStorage - это функция по умолчанию, используемая Pig для загрузки/сохранения данных. PigStorage поддерживает структурированные текстовые файлы (в удобочитаемом формате UTF-8) в сжатом или несжатом виде (см. Обработка сжатия). Все типы данных Pig (данные), как простые, так и сложные, могут быть считываться/записываться с помощью этой функции. Входные данные для загрузки могут быть файлом, каталогом или шаблоном.

Заявления LOAD/STORE

Заявления LOAD – PigStorage ожидает, что данные будут отформатированы с помощью разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа.

Заявления STORE – PigStorage выводит данные с помощью разделителей полей, либо символа табуляции ('\t'), либо другого указанного символа, а также разделителя записей новой строки ('\n').

Разделители полей/записей

Разделители полей – по умолчанию разделителем полей в операторах LOAD и STORE является символ табуляции ('\t'). Вы можете использовать другие символы в качестве разделителей полей, но такие разделители, как ^A или Ctrl-A, должны быть представлены в Unicode (\u0001) с использованием кодировки UTF-16 (см. Википедию ASCII, Unicode и UTF-16).

Разделители записей – для операторов LOAD Pig интерпретирует символы новой строки ('\n'), возврата каретки ('\r' или CTRL-M) и комбинированные символы CR + LF ('\r\n') в качестве разделителей записей (не используйте эти символы в качестве разделителей полей). Для операторов STORE Pig использует символ новой строки ('\n') в качестве разделителя записей.

Схемы

Если указана опция схемы, при сохранении данных в выходном каталоге создается скрытый файл «.pig_schema». Он используется PigStorage (с или без -схема) при загрузке, чтобы определить имена и типы полей данных без необходимости явного указания схемы пользователем в операторе as, если не указан noschema. При загрузке не пытаются объединить конфликтующие схемы. Используется первая схема, встреченная при сканировании файловой системы.

Кроме того, если указана опция схемы, в выходном каталоге создается файл «.pig_headers». Этот файл просто перечисляет алиасы, разделители. Это предназначено для упрощения экспорта в инструменты, которые могут читать файлы с заголовками (достаточно добавить заголовок к вашим данным).

Если опция схемы НЕ указана, при сохранении данных схема не будет записана.

Если опция noschema НЕ указана и схема найдена, она загружается при загрузке данных.

Обратите внимание, что независимо от того, сохраняете ли вы схему, вам всегда нужно указать правильный разделитель для чтения данных. Если вы сохраняете с разделителем «#», а затем загружаете с разделителем по умолчанию, ваши данные не будут правильно обработаны.

Происхождение записей

Если указана опция tagPath или tagFile, PigStorage добавит псевдостолбец INPUT_FILE_PATH или INPUT_FILE_NAME соответственно в начало записи. Как следует из названия, это путь/имя входного файла, содержащего эту конкретную запись. Обратите внимание, что tagsource устарел.

Сложные типы данных

Форматы сложных типов данных показаны здесь:

  • Кортеж: заключен в (), элементы разделены запятыми
    • Непустой кортеж: (item1,item2,item3)
    • Пустой кортеж допустим: ()
  • Набор: заключен в {}, кортежи разделены запятыми
    • Непустой набор: {{(tuple1),(tuple2),(tuple3)}}
    • Пустой набор допустим: {}
  • Словарь: заключен в [], элементы разделены запятыми, ключ и значение разделены «#»
    • Непустой словарь: [key1#value1,key2#value2]
    • Пустой словарь допустим: []

Если в операторе LOAD указана схема, Pig преобразует сложный тип в соответствии со схемой. Если преобразование не выполняется, соответствующий элемент будет null (см. Null и Pig Latin).

Примеры

В этом примере PigStorage ожидает, что input.txt будет содержать поля, разделенные табуляцией, и записи, разделенные новой строкой. Заявления эквивалентны.

A = LOAD 'student' USING PigStorage('\t') AS (name: chararray, age:int, gpa: float); 

A = LOAD 'student' AS (name: chararray, age:int, gpa: float);

В этом примере PigStorage сохраняет содержимое X в файлы с полями, разделенными звездочкой (*). Оператор STORE указывает, что файлы будут находиться в каталоге с именем output и что файлы будут называться part-nnnnn (например, part-00000).

STORE X INTO  'output' USING PigStorage('*');

В этом примере PigStorage загружает данные со сложным типом данных, набором словаря и двойным значением.

a = load '1.txt' as (a0:{t:(m:map[int],d:double)});

{([foo#1,bar#2],34.0),([white#3,yellow#4],45.0)} : valid
{([foo#badint],baddouble)} : conversion fail for badint/baddouble, get {([foo#],)}
{} : valid, empty bag

TextLoader

Загружает неструктурированные данные в формате UTF-8.

Синтаксис

TextLoader()

Термины

none

без параметров

Использование

TextLoader работает с неструктурированными данными в формате UTF8. Каждая полученная кортеж содержит одно поле с одной строкой входного текста. TextLoader также поддерживает сжатие.

В настоящее время поддержка сжатия TextLoader ограничена.

TextLoader не может использоваться для хранения данных.

Пример

В этом примере TextLoader используется с функцией LOAD.

A = LOAD 'data' USING TextLoader();

HBaseStorage

Загружает и сохраняет данные из таблицы HBase.

Синтаксис

HBaseStorage('columns', ['options'])

Термины

columns

Список квалифицированных столбцов HBase для чтения данных или сохранения данных. Имя семейства столбцов и квалификатор столбца разделены двоеточием (:). Необходимо указать только столбцы, используемые в скрипте Pig. Столбцы указываются одним из трех способов, описанных ниже.

  • Явно указать семейство столбцов и квалификатор столбца (например, user_info:id). Это создаст скаляр в результирующей кортеже.
  • Указать семейство столбцов и часть имени квалификатора столбца в качестве префикса, за которым следует звездочка (например, user_info:address_*). Этот подход используется для чтения одного или нескольких столбцов из того же семейства столбцов с совпадающим префиксом описателя. Тип данных для этого поля будет являться отображением имени описателя столбца на значение поля. Обратите внимание, что объединение этого стиля префикса с длинным списком полных имен описателей столбцов может привести к снижению производительности при сканировании HBase. Это создаст карту Pig в результирующей кортеже, где ключами будут описатели столбцов.
  • Указать все столбцы семейства столбцов, используя имя семейства столбцов, за которым следует звездочка (например, user_info:*). Это создаст карту Pig в результирующей кортеже, где ключами будут описатели столбцов.

'options'

Строка, содержащая разделенные пробелами параметры ('-optionA=valueA -optionB=valueB -optionC=valueC')

В настоящее время поддерживаемые параметры:

  • -loadKey=(true|false) Загрузить ключ строки в качестве первого значения в каждой кортеже, возвращаемой из HBase (по умолчанию false)
  • -gt=minKeyVal Возвратить строки с rowKey больше, чем minKeyVal
  • -lt=maxKeyVal Возвратить строки с rowKey меньше, чем maxKeyVal
  • -regex=regex Возвратить строки с rowKey, которые соответствуют этому регулярному выражению на KeyVal
  • -gte=minKeyVal Возвратить строки с rowKey больше или равно minKeyVal
  • -lte=maxKeyVal Возвратить строки с rowKey меньше или равно maxKeyVal
  • -limit=numRowsPerRegion Максимальное количество строк для извлечения на регион
  • -caching=numRows Количество строк для кеширования (более быстрые сканирования, больше памяти)
  • -delim=delimiter Разделитель столбцов в списке столбцов (по умолчанию — пробел)
  • -ignoreWhitespace=(true|false) При установке delim на значение, отличное от пробела, игнорировать пробелы при разборе списка столбцов (по умолчанию — true)
  • -caster=(HBaseBinaryConverter|Utf8StorageConverter) Имя класса преобразователя для преобразования значений (по умолчанию — Utf8StorageConverter). Преобразователь по умолчанию может быть переопределен с помощью параметра конфигурации pig.hbase.caster. Преобразователи должны реализовывать LoadStoreCaster.
  • -noWAL=(true|false) Во время хранения устанавливает write ahead в false для более быстрого загрузки в HBase (по умолчанию — false). Используйте с осторожностью, так как это может привести к потере данных (см. http://hbase.apache.org/book.html#perf.hbase.client.putwal).
  • -minTimestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания больше или равную этому значению
  • -maxTimestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания меньше этого значения
  • -timestamp=timestamp Возвратить значения ячеек, которые имеют временную метку создания равную этому значению

Использование

HBaseStorage хранит и загружает данные из HBase. Функция принимает два аргумента. Первый аргумент — это список столбцов, разделенных пробелами. Второй необязательный аргумент — это список параметров, разделенных пробелами. Синтаксис столбцов и доступные параметры перечислены выше. Обратите внимание, что HBaseStorage всегда отключает комбинирование разделов.

Пример загрузки

В этом примере HBaseStorage используется с функцией LOAD со явным схеме.

raw = LOAD 'hbase://SomeTableName'
      USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
      'info:first_name info:last_name tags:work_* info:*', '-loadKey=true -limit=5') AS
      (id:bytearray, first_name:chararray, last_name:chararray, tags_map:map[], info_map:map[]);

Типы данных столбцов объявляются с помощью оператора «AS». Столбцы first_name и last_name указаны как полностью квалифицированные имена столбцов с типом данных chararray. Третий указание tags:work_* запрашивает набор столбцов в семействе столбцов tags, которые начинаются с "work_". В таблице HBase может быть ноль, одно или несколько столбцов такого типа. Тип указан как tags_map:map[]. Это указывает, что набор возвращаемых значений столбцов будет доступен как карта, где ключом является имя столбца, а значением — значение ячейки столбца. Четвертое указание столбца также является отображением описателей столбцов на значения ячеек.

Когда тип столбца указан как карта в операторе «AS», ключами карты являются имена описателей столбцов, а тип данных — chararray. Тип данных значений столбцов можно явно указать, как показано в примерах ниже:

  • tags_map[chararray] — В этом случае значения столбцов объявлены как имеющие тип chararray
  • tags_map[int] — В этом случае значения столбцов объявлены как имеющие тип int.

Пример сохранения

В этом примере HBaseStorage используется для сохранения отношения в HBase.

A = LOAD 'hdfs_users' AS (id:bytearray, first_name:chararray, last_name:chararray);
STORE A INTO 'hbase://users_table' USING org.apache.pig.backend.hadoop.hbase.HBaseStorage(
    'info:first_name info:last_name');

В примере выше отношение A загружается из HDFS и сохраняется в HBase. Обратите внимание, что схема отношения A является кортежем размера 3, но в конструктор HBaseStorage передаются только два имени описателей столбцов. Это связано с тем, что первое значение в кортеже используется в качестве ключа строки HBase.

AvroStorage

Загружает и сохраняет данные из файлов Avro.

Синтаксис

Avrostorage(['schema|record name'], ['options'])

Термины

schema

Строка JSON, определяющая схему Avro для входных данных. Вы можете указать явную схему при сохранении данных или при загрузке данных. При ручном предоставлении схемы Pig будет использовать предоставленную схему для сериализации и десериализации. Это означает, что вы можете предоставить явную схему при сохранении данных, чтобы упростить вывод (например, удалив nullable unions) или переименовать поля. Это также означает, что вы можете предоставить явную схему при чтении данных, чтобы читать только подмножество полей в каждом записях.

См. документацию Apache Avro для получения дополнительной информации о том, как указать корректную схему.

record name

При сохранении пакета кортежей с помощью AvroStorage, если вы не хотите указывать полную схему, вы можете указать имя записи avro вместо этого. (AvroStorage определит, что аргумент не является корректным определением схемы и использует его в качестве имени переменной вместо этого.)

'options'

Строка, содержащая разделенные пробелами параметры ('-optionA valueA -optionB valueB -optionC ’)

В настоящее время поддерживаемые параметры:

  • -namespace nameSpace или -n nameSpace Явно указать поле пространства имен в записях Avro при сохранении данных
  • -schemfile schemaFile или -f schemaFile Указать входную (или выходную) схему из внешнего файла. Pig предполагает, что файл находится на файловой системе по умолчанию, но вы можете использовать явную URL-адрес, чтобы однозначно указать расположение. (Например, если данные находились на вашей локальной файловой системе в /stuff/schemafile.avsc, вы могли бы указать "-f file:///stuff/schemafile.avsc" для указания расположения. Если данные находились в HDFS в /yourdirectory/schemafile.avsc, вы могли бы указать "-f hdfs:///yourdirectory/schemafile.avsc"). Pig ожидает, что это текстовый файл, содержащий корректную схему avro.
  • -examplefile exampleFile или -e exampleFile Указать входную (или выходную) схему, используя другой файл Avro в качестве примера. Pig предполагает, что файл находится на файловой системе по умолчанию, но вы можете использовать явную URL-адрес для указания расположения. Pig ожидает, что это файл Avro данных.
  • -allowrecursive или -r Указать, разрешить ли рекурсивные определения схемы (по умолчанию — выбросить исключение, если Pig столкнется с рекурсивной схемой). При чтении объектов с рекурсивными определениями Pig будет преобразовывать записи Avro в кортежи без схемы; схема Pig для объекта может не совпадать с данными точно.
  • -doublecolons или -d Указать, как обрабатывать схемы Pig, которые содержат двойные двоеточия при записи данных в формате Avro. (Когда вы объединяете два пакета в Pig, Pig автоматически маркирует поля в выходных кортежах именами, которые содержат двойные двоеточия). Если вы выберите этот параметр, AvroStorage будет преобразовывать имена с двойными двоеточиями в имена с двойными подчёркиваниями.

Использование

AvroStorage хранит и загружает данные из файлов Avro. Часто вы можете загружать и сохранять данные с помощью AvroStorage, не зная много о формате сериализации Avro. AvroStorage попытается автоматически преобразовать схему pig и данные pig в данные avro или данные avro в данные pig.

По умолчанию, когда вы используете AvoStorage для загрузки данных, AvroStorage будет использовать поиск в глубину для поиска допустимого файла Avro в пути к входным данным, а затем использовать схему из этого файла для загрузки данных. Когда вы используете AvroStorage для сохранения данных, AvroStorage попытается преобразовать схему Pig в эквивалентную схему Avro. Вы можете вручную указать схему, предоставив явную схему в Pig, загрузив схему из внешнего файла схемы или явно указав Pig прочитать схему из определенного файла avro.

Для сжатия выходных данных с помощью AvroStorage необходимо использовать соответствующие свойства Avro для сжатия. Например, для включения сжатия с помощью deflate уровня 5, вы бы указали

SET avro.output.codec 'deflate'
SET avro.mapred.deflate.level 5

Допустимые значения для avro.output.codec включают deflate, snappy и null.

Существуют некоторые ключевые различия между данными Avro и Pig, и в некоторых случаях полезно понимать различия между моделями данных Avro и Pig. Перед записью данных Pig в Avro (или созданием файлов Avro для использования в Pig), помните, что может не быть эквивалентной схемы Avro для каждой схемы Pig (и наоборот):

  • Определения рекурсивных схем Вы не можете определять схемы рекурсивно в Pig, но можете определять их рекурсивно в Avro.
  • Разрешенные символы Схемы Pig иногда могут содержать такие символы, как двоеточие (":"), которые являются недопустимыми в именах Avro.
  • Объединения В Avro вы можете определить объект, который может быть одного из нескольких различных типов (включая сложные типы, такие как записи). В Pig этого нельзя сделать.
  • Перечисления Avro позволяет определять перечисления для эффективного и абстрактного представления категориальных переменных, но Pig этого не поддерживает.
  • Массивы байтов с фиксированной длиной Avro позволяет определять массивы байтов с фиксированной длиной, но Pig этого не поддерживает.
  • Значения с возможностью NULL В Pig все типы данных могут содержать значения NULL. В Avro этого нет.

Вот как AvroStorage преобразует значения Pig в Avro:

Оригинальный тип Pig Преобразованный тип Avro
Целые числа int ["int","null"]
Длинные числа long ["long,"null"]
Числа с плавающей точкой одинарной точности float ["float","null"]
Числа с плавающей точкой двойной точности double ["double","null"]
Строки chararray ["string","null"]
Массивы байтов bytearray ["bytes","null"]
Булевы значения boolean ["boolean","null"]
Кортежи tuple Схема кортежа Pig будет преобразована в объединение записи Avro с эквивалентной схемой и значением null.
Наборы кортежей bag Схема кортежа Pig будет преобразована в объединение массива записей с эквивалентной схемой и значением null.
Словари map Схема кортежа Pig будет преобразована в объединение словаря записей с эквивалентной схемой и значением null.

Вот как AvroStorage преобразует значения Avro в Pig:

Оригинальные типы Avro Преобразованный тип Pig
Целые числа ["int","null"] или "int" int
Длинные числа ["long,"null"] или "long" long
Числа с плавающей точкой одинарной точности ["float","null"] или "float" float
Числа с плавающей точкой двойной точности ["double","null"] или "double" double
Строки ["string","null"] или "string" chararray
Перечисления Перечисление или объединение перечисления и null chararray
Массивы байтов ["bytes","null"] или "bytes" bytearray
Фиксированные массивы Массив байтов фиксированной длины или объединение массива фиксированной длины и null bytearray
Булевы значения ["boolean","null"] или "boolean" boolean
Кортежи Тип записи или объединение записи и null tuple
Наборы кортежей Массив или объединение массива и null bag
Словари Словарь или объединение словаря и null map

Во многих случаях AvroStorage автоматически корректно преобразует ваши данные, и вам не нужно предоставлять AvroStorage дополнительную информацию. Но иногда может быть удобно вручную указать схему для AvroStorage. Смотрите примеры ниже для примеров по ручному указанию схемы с AvroStorage.

Примеры загрузки

Предположим, что у вас есть файл данных Avro (расположенный в 'stuff') со следующей схемой:

{"type" : "record",
 "name" : "stuff",
 "fields" : [
   {"name" : "label", "type" : "string"}, 
   {"name" : "value", "type" : "int"},
   {"name" : "marketingPlans", "type" : ["string", "bytearray", "null"]}
  ]
}

Кроме того, предположим, что вам не нужно значение поля "marketingPlans". (Это хорошо, потому что AvroStorage не знает, как преобразовать эту схему Avro в схему Pig). Чтобы загрузить в Pig только поля "label" и "value", вы можете вручную указать схему, передаваемую AvroStorage:

measurements = LOAD 'stuff' USING AvroStorage(
  '{"type":"record","name":"measurement","fields":[{"name":"label","type":"string"},{"name":"value","type":"int"}]}'
  );

Примеры сохранения

Предположим, что вы сохраняете набор, называемый measurements, со схемой:

measurements:{measurement:(label:chararray,value:int)}

Чтобы сохранить этот набор в файл с именем "measurements", вы можете использовать оператор:

STORE measurements INTO 'measurements' USING AvroStorage('measurement');

AvroStorage преобразует это в схему Avro

{"type":"record", 
 "name":"measurement",
 "fields" : [
   {"name" : "label", "type" : ["string", "null"]}, 
   {"name" : "value", "type" : ["int", "null"]}
  ]
} 

Но предположим, что вы знаете, что поля label и value никогда не будут null. Вы можете определить более точную схему вручную, используя оператор:

STORE measurements INTO 'measurements' USING AvroStorage(
  '{"type":"record","name":"measurement","fields":[{"name":"label","type":"string"},{"name":"value","type":"int"}]}'
  );

TrevniStorage

Загружает и сохраняет данные из файлов Trevni.

Синтаксис

TrevniStorage(['schema|record name'], ['options'])

Trevni — это ориентированный на столбцы формат хранения, являющийся частью проекта Apache Avro. Trevni тесно связан с Avro.

Аналогично, TrevniStorage очень тесно связан с AvroStorage и использует те же параметры, что и AvroStorage. Подробное описание аргументов для TrevniStorage см. в разделе AvroStorage.

AccumuloStorage

Загружает или сохраняет данные из таблицы Accumulo. Первый элемент в кортеже эквивалентен «строке» из ключа Accumulo, а столбцы в этой строке могут быть сгруппированы различными статическими или со звёздочкой способами. Базовая функциональность с подстановкой звёздочкой существует для группировки различных семейств/квалификаторов столбцов в Map для загрузки или сериализации Map в какую-либо группу семейств/квалификаторов столбцов при сохранении.

Синтаксис

AccumuloStorage(['columns'[, 'options']])

Аргументы

'columns'

Список столбцов, разделенных запятыми, для чтения данных и записи данных. Каждый из этих столбцов может быть одного из трёх типов:

  1. Литерал
  2. Префикс семейства столбцов
  3. Префикс квалификатора столбцов

Литерал: это самое простое задание, строка, разделенная двоеточием, которая отображается на семейство столбцов и квалификатор столбца. Это будет читать/записывать простой скаляр из/в Accumulo.

Префикс семейства столбцов: при чтении данных это будет получать данные из Accumulo Key-Value в текущей строке, семейство столбцов которой соответствует заданному префиксу. Это приведет к размещению Map в кортеже. При записи данных также ожидается Map в заданном смещении в кортеже, ключи которого будут добавлены к префиксу семейства столбцов, используется пустой квалификатор столбца, и значение Map будет помещено в значение Accumulo. Валидный префикс семейства столбцов — это литерал звёздочка (*), в этом случае ключ Map будет эквивалентен семейству столбцов Accumulo.

Префикс квалификатора столбцов: аналогично префиксу семейства столбцов, но работает с квалификатором столбца. При чтении Accumulo Key-Value в той же строке, которые соответствуют заданному семейству столбцов и префиксу квалификатора столбцов, будут помещены в один Map. При записи данных будет использоваться семейство столбцов из задания столбцов, ключ Map будет добавлен к предоставленному в задании префиксу квалификатора столбца, и значение Map будет значением Accumulo.

Если «columns» не предоставлен или является пустой строкой, он обрабатывается эквивалентно «*». Это означает, что при отсутствии строки задания столбцов, для чтения все столбцы в заданной строке Accumulo будут помещены в один Map (с ключами Map, разделенными двоеточием, чтобы сохранить семейство/квалификатор столбцов из Accumulo). Для записи ключи Map будут помещены в семейство столбцов, а квалификатор столбцов будет пустым.

'options'

Строка, содержащая разделенные пробелами параметры ("optionA valueA -optionB valueB -optionC valueC")

В настоящее время поддерживаются следующие параметры:

  • (-c|--caster) LoadStoreCasterImpl Реализация LoadStoreCaster для использования при сериализации типов в Accumulo, обычно AccumuloBinaryConverter или UTF8StringConverter, по умолчанию UTF8StorageConverter.
  • (-auths|--authorizations) auth1,auth2... Список Accumulo авторизаций, разделенных запятыми, для использования при чтении данных из Accumulo. По умолчанию пустой набор авторизаций (нет).
  • (-s|--start) start_row Строка Accumulo, с которой начинать чтение, включительно
  • (-e|--end) end_row Строка Accumulo, до которой читать, включительно
  • (-buff|--mutation-buffer-size) num_bytes Количество байтов для буферизации при записи данных в Accumulo. Более высокое значение требует больше памяти
  • (-wt|--write-threads) num_threads Количество потоков, используемых для записи данных в Accumulo.
  • (-ml|--max-latency) milliseconds Максимальное время в миллисекундах, прежде чем данные будут сброшены в Accumulo.
  • (-sep|--separator) str Разделитель, используемый при парсинге задания столбцов, по умолчанию запятая (,)
  • (-iw|--ignore-whitespace) (true|false) Должен ли пробел быть удален из задания столбцов, по умолчанию true

Использование

AccumuloStorage имеет функциональность для хранения и извлечения данных из Accumulo. Его цель — предоставить простую, широко применимую схему таблицы, совместимую с API Pig. Каждый кортеж содержит подмножество столбцов, хранящихся в одной строке таблицы Accumulo, что зависит от столбцов, переданных в качестве аргумента функции. Если предоставлен «*», будут возвращены все столбцы таблицы. Второй аргумент предоставляет управление различными параметрами, которые могут быть использованы для изменения различных свойств.

При вызове сценариев Pig, использующих AccumuloStorage, важно убедиться, что Pig имеет Accumulo JAR-файлы в своем классе. Это легко достигается с помощью переменной окружения ACCUMULO_HOME.

PIG_CLASSPATH="$ACCUMULO_HOME/lib/*:$PIG_CLASSPATH" pig my_script.pig

Пример загрузки

Просто получить все столбцы из кодов аэропортов, которые находятся между Бостоном и Сан-Франциско, которые можно просмотреть с авторизациями Accumulo «auth1» и/или «auth2».

raw = LOAD 'accumulo://airports?instance=accumulo&user=root&password=passwd&zookeepers=localhost'
      USING org.apache.pig.backend.hadoop.accumulo.AccumuloStorage(
      '*', '-a auth1,auth2 -s BOS -e SFO') AS
      (code:chararray, all_columns:map[]);

Типы данных столбцов объявляются с помощью предложения «AS». В этом примере ключ строки, который является уникальным кодом аэропорта, назначается переменной «code», а все остальные столбцы помещаются в карту. Когда квалификатор столбца не пустой, ключ в этой карте будет иметь двоеточие, которое отделяет часть ключа, взятую из семейства столбцов, от части, взятой из квалификатора столбца. Значение Accumulo помещается в значение карты.

В большинстве случаев для получения всех столбцов нет необходимости и нежелательно по соображениям производительности.

raw = LOAD 'accumulo://airports?instance=accumulo&user=root&password=passwd&zookeepers=localhost'
      USING org.apache.pig.backend.hadoop.accumulo.AccumuloStorage(
      'name,building:num_terminals,carrier*,reviews:transportation*') AS
      (code:chararray name:bytearray carrier_map:map[] transportion_reviews_map:map[]);

При запросе столбцов можно использовать звездочку для группирования набора столбцов в одну карту вместо перечисления каждого столбца.

Пример сохранения

Данные можно легко сохранить в Accumulo.

A = LOAD 'flights.txt' AS (id:chararray, carrier_name:chararray, src_airport:chararray, dest_airport:chararray, tail_number:int);
STORE A INTO 'accumulo://flights?instance=accumulo&user=root&password=passwd&zookeepers=localhost' USING 
    org.apache.pig.backend.hadoop.accumulo.AccumuloStorage('carrier_name,src_airport,dest_airport,tail_number');

Здесь мы читаем файл «flights.txt» из HDFS и сохраняем результаты в отношение A. Мы извлекаем уникальный идентификатор рейса, его пункт отправления и назначения и номер борта из данного файла. При сохранении обратно в Accumulo мы указываем спецификации столбцов (в данном случае только семейство столбцов). Также важно отметить, что предоставляется четыре элемента в качестве столбцов, поскольку первый элемент в кортеже используется в качестве строки в Accumulo.

OrcStorage

Загружает или сохраняет данные в файл Orc.

Синтаксис

OrcStorage(['options'])

Параметры

Строка, содержащая разделенные пробелами параметры («-optionA valueA -optionB valueB -optionC ’). Текущие параметры применимы только к операции STORE, а не к LOAD.

В настоящее время поддерживаются следующие параметры:

  • --stripeSize или -s Установка размера полосы для файла. По умолчанию 268435456 (256 МБ).
  • --rowIndexStride или -r Установка расстояния между записями в индексе строк. По умолчанию 10000.
  • --bufferSize или -b Установка размера буферов памяти, используемых для сжатия и сохранения полосы в памяти. По умолчанию 262144 (256 КБ).
  • --blockPadding или -p Установка того, будут ли блоки HDFS заполнены, чтобы предотвратить наложение полос на блоки. По умолчанию true.
  • --compress или -c Установка общего сжатия, используемого для сжатия данных. Допустимые кодеки: NONE, ZLIB, SNAPPY, LZO. По умолчанию ZLIB.
  • --version или -v Установка версии файла, который будет записан

Пример

OrcStorage в качестве StoreFunc.

A = LOAD 'student.txt' as (name:chararray, age:int, gpa:double);
store A into 'student.orc' using OrcStorage('-c SNAPPY'); -- store student.txt into data.orc with SNAPPY compression

OrcStorage в качестве LoadFunc.

A = LOAD 'student.orc' USING OrcStorage();
describe A; -- See the schema of student.orc
B = filter A by age > 25 and gpa < 3; -- filter condition will be pushed up to loader
dump B; -- dump the content of student.orc

Типы данных

Большинство типов данных Orc имеют взаимно однозначное отображение на типы данных Pig. Есть несколько исключений:

На стороне загрузчика:

  • Orc STRING/CHAR/VARCHAR все отображаются в Pig varchar
  • Orc BYTE/BINARY все отображаются в Pig bytearray
  • Orc TIMESTAMP/DATE все отображаются в Pig datetime
  • Orc DECIMAL отображается в Pig bigdecimal

На стороне сохранителя:

  • Pig chararray отображается в Orc STRING
  • Pig datetime отображается в Orc TIMESTAMP
  • Pig bigdecimal/biginteger отображаются в Orc DECIMAL
  • Pig bytearray отображается в Orc BINARY

Проталкивание предиката

Если после OrcStorage есть оператор фильтрации, Pig протащит условие фильтрации в загрузчик. OrcStorage обрезает файлы/полосы/группы строк, которые полностью не удовлетворяют условию. Для файла/полосы/группы строк, содержащих данные, удовлетворяющие условию фильтрации, OrcStorage загрузит файл/полосу/группу строк, а Pig повторно проверит условие фильтрации, чтобы удалить дополнительные данные, которые не удовлетворяют условию фильтрации.

Проталкивание предиката OrcStorage в настоящее время поддерживает все примитивные типы данных, но ни один из сложных типов данных. Например, условие карты не может быть протащено в OrcStorage:

A = LOAD 'student.orc' USING OrcStorage();
B = filter A by info#'age' > 25; -- map condition cannot push to OrcStorage
dump B;

В настоящее время в проталкивании предиката OrcStorage поддерживаются следующие выражения в условии фильтрации: >, >=, <, <=, ==, !=, between, in, and, or, not. Отсутствующие выражения: is null, is not null, matches.

Функции математики

Для получения общей информации об этих функциях см. спецификацию Java API, класс Math. Обратите внимание на следующее:

  • Имена функций Pig чувствительны к регистру и пишутся ЗАГЛАВНЫМИ БУКВАМИ.

  • Pig может обрабатывать результаты иначе, чем указано в спецификации Java API:

    • Если результирующее значение равно null или пусто, Pig возвращает null.

    • Если результирующее значение не является числом (NaN), Pig возвращает null.

    • Если Pig не может обработать выражение, Pig возвращает исключение.

ABS

Возвращает абсолютное значение выражения.

Синтаксис

ABS(expression)

Термины

expression

Любое выражение, результатом которого является тип int, long, float или double.

Использование

Используйте функцию ABS для возврата абсолютного значения выражения. Если результат неотрицателен (x ≥ 0), возвращается результат. Если результат отрицателен (x < 0), возвращается отрицание результата.

ACOS

Возвращает арккосинус выражения.

Синтаксис

ACOS(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ACOS для возврата арккосинуса выражения.

ASIN

Возвращает арксинус выражения.

Синтаксис

ASIN(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ASIN для возврата арксинуса выражения.

ATAN

Возвращает арктангенс выражения.

Синтаксис

ATAN(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию ATAN для возврата арктангенса выражения.

CBRT

Возвращает кубический корень выражения.

Синтаксис

CBRT(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию CBRT для возврата кубического корня выражения.

CEIL

Возвращает значение выражения, округленное вверх до ближайшего целого числа.

Синтаксис

CEIL(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию CEIL для возврата значения выражения, округленного вверх до ближайшего целого числа. Эта функция никогда не уменьшает результирующее значение.

x

CEIL(x)

4.6

5

3.5

4

2.4

3

1.0

1

-1.0

-1

-2.4

-2

-3.5

-3

-4.6

-4

COS

Возвращает тригонометрический косинус выражения.

Синтаксис

COS(expression)

Термины

expression

Выражение (угол), результатом которого является тип double.

Использование

Используйте функцию COS для возврата тригонометрического косинуса выражения.

COSH

Возвращает гиперболический косинус выражения.

Синтаксис

COSH(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию COSH для возврата гиперболического косинуса выражения.

EXP

Возвращает число Эйлера e, возведенное в степень x.

Синтаксис

EXP(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию EXP для возврата значения числа Эйлера e, возведенного в степень x (где x - результирующее значение выражения).

FLOOR

Возвращает значение выражения, округленное вниз до ближайшего целого числа.

Синтаксис

FLOOR(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию FLOOR для возврата значения выражения, округленного вниз до ближайшего целого числа. Эта функция никогда не увеличивает результирующее значение.

x

FLOOR(x)

4.6

4

3.5

3

2.4

2

1.0

1

-1.0

-1

-2.4

-3

-3.5

-4

-4.6

-5

LOG

Возвращает натуральный логарифм (по основанию e) выражения.

Синтаксис

LOG(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию LOG для возврата натурального логарифма (по основанию e) выражения.

LOG10

Возвращает логарифм по основанию 10 выражения.

Синтаксис

LOG10(expression)

Термины

expression

Выражение, результатом которого является тип double.

Использование

Используйте функцию LOG10 для возврата логарифма по основанию 10 выражения.

RANDOM

Возвращает псевдослучайное число.

Синтаксис

RANDOM( )

Термины

N/A

Нет терминов.

Использование

Используйте функцию RANDOM для возврата псевдослучайного числа (тип double), большего или равного 0,0 и меньшего 1,0.

ROUND

Возвращает значение выражения, округленное до целого числа.

Синтаксис

ROUND(expression)

Термины

expression

Выражение, результатом которого является тип float или double.

Использование

Используйте функцию ROUND для возврата значения выражения, округленного до целого числа (если тип результата float) или округленного до long (если тип результата double).

Значения округляются в сторону положительной бесконечности: round(x) = floor(x + 0.5).

x

ROUND(x)

4.6

5

3.5

4

2.4

2

1.0

1

-1.0

-1

-2.4

-2

-3.5

-3

-4.6

-5

ROUND_TO

Возвращает значение выражения, округленного до фиксированного количества десятичных знаков.

Синтаксис

ROUND_TO(val, digits [, mode])

Термины

val

Выражение, результатом которого является тип float или double: значение для округления.

digits

Выражение, результатом которого является тип int: количество знаков для сохранения.

mode

Необязательный int, указывающий метод округления, в соответствии с константами, предоставляемыми Java.

Использование

Используйте функцию ROUND для возврата значения выражения, округленного до фиксированного количества знаков. Для float результатом будет float; для double результатом будет double.

Результат является кратным digits-ой степени десяти: 0 приводит к отсутствию дробных знаков; отрицательное значение обнуляет соответствующее количество мест слева от десятичной точки.

Когда mode опущен или имеет значение 6 (RoundingMode.HALF_EVEN), результат округляется до ближайшего соседа, а при совпадении округляется до ближайшего четного числа. Этот режим минимизирует кумулятивную ошибку и стремится сохранить среднее значение набора значений.

Когда mode имеет значение 4 (RoundingMode.HALF_UP), результат округляется до ближайшего соседа, а при совпадении округляется от нуля. Этот режим соответствует поведению большинства SQL-систем.

Для других режимов округления обратитесь к документации Java. Нет режима округления, который соответствует поведению Math.round (т. е. округление к положительной бесконечности) — вините Java, а не Pig.

val

digits

mode

ROUND_TO(val, digits)

1234.1789

8

1234.1789

1234.1789

4

1234.1789

1234.1789

1

1234.2

1234.1789

0

1234.0

1234.1789

-1

1230.0

1234.1789

-3

1000.0

1234.1789

-4

0.0

3.25000001

1

3.3

3.25

1

3.2

-3.25

1

-3.2

3.15

1

3.2

-3.15

1

-3.2

3.25

1

4

3.3

-3.25

1

4

-3.3

3.5

0

4.0

-3.5

0

-4.0

2.5

0

2.0

-2.5

0

-2.0

3.5

0

4

4.0

-3.5

0

4

-4.0

2.5

0

4

3.0

-2.5

0

4

-3.0

SIN

Возвращает синус выражения.

Синтаксис

SIN(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SIN для возврата синуса выражения.

SINH

Возвращает гиперболический синус выражения.

Синтаксис

SINH(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SINH для возврата гиперболического синуса выражения.

SQRT

Возвращает положительный квадратный корень из выражения.

Синтаксис

SQRT(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию SQRT для возврата положительного квадратного корня из выражения.

TAN

Возвращает тригонометрический тангенс угла.

Синтаксис

TAN(expression)

Термины

expression

Выражение (угол), результатом которого является double.

Использование

Используйте функцию TAN для возврата тригонометрического тангенса угла.

TANH

Возвращает гиперболический тангенс выражения.

Синтаксис

TANH(expression)

Термины

expression

Выражение, результатом которого является double.

Использование

Используйте функцию TANH для возврата гиперболического тангенса выражения.

Строковые функции

Для общей информации об этих функциях, см. Java API Specification, Class String. Обратите внимание на следующее:

  • Имена функций Pig чувствительны к регистру и записываются в верхнем регистре.

  • Функции Pig для строк имеют дополнительный первый параметр: строку, к которой применяются все операции.

  • Pig может обрабатывать результаты по-другому, чем указано в Java API Specification. Если любой из входных параметров равен null или если предоставлено недостаточное количество параметров, возвращается NULL.

ENDSWITH

Проверяет входные данные, чтобы определить, заканчивается ли первый аргумент строкой во втором.

Синтаксис

ENDSWITH(строка, проверкаНа)

Термины

строка

Строка, подлежащая проверке.

проверкаНа

Строка для проверки.

Использование

Используйте функцию ENDSWITH, чтобы определить, заканчивается ли первый аргумент строкой во втором.

Например, ENDSWITH ('foobar', 'foo') вернёт false, а ENDSWITH ('foobar', 'bar') вернёт true.

EqualsIgnoreCase

Сравнивает две строки, игнорируя регистр.

Синтаксис

EqualsIgnoreCase(строка1, строка2)

Термины

строка1

Исходная строка.

строка2

Строка для сравнения.

Использование

Используйте функцию EqualsIgnoreCase для определения равенства двух строк, игнорируя регистр.

INDEXOF

Возвращает индекс первого вхождения символа в строке, ища вперёд с начального индекса.

Синтаксис

INDEXOF(строка, 'символ', начальныйИндекс)

Термины

строка

Строка для поиска.

'символ'

Искомый символ, в кавычках.

начальныйИндекс

Индекс, с которого начинать поиск вперёд.

Индекс строки начинается с нуля (0).

Использование

Используйте функцию INDEXOF для определения индекса первого вхождения символа в строке. Поиск вперёд по символу начинается с указанного начального индекса.

LAST_INDEX_OF

Возвращает индекс последнего вхождения символа в строке, ища назад с конца строки.

Синтаксис

LAST_INDEX_OF(строка, 'символ')

Термины

строка

Строка для поиска.

'символ'

Искомый символ, в кавычках.

Использование

Используйте функцию LAST_INDEX_OF для определения индекса последнего вхождения символа в строке. Поиск назад по символу начинается с конца строки.

LCFIRST

Преобразует первый символ в строке в нижний регистр.

Синтаксис

LCFIRST(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию LCFIRST для преобразования только первого символа строки в нижний регистр.

LOWER

Преобразует все символы в строке в нижний регистр.

Синтаксис

LOWER(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию LOWER для преобразования всех символов в строке в нижний регистр.

LTRIM

Возвращает копию строки с удалёнными только начальными пробелами.

Синтаксис

LTRIM(выражение)

Термины

выражение

Выражение, результатом которого является chararray.

Использование

Используйте функцию LTRIM для удаления начальных пробелов из строки.

REGEX_EXTRACT

Выполняет сопоставление с регулярным выражением и извлекает соответствующую группу, определённую индексом.

Синтаксис

REGEX_EXTRACT (строка, regex, индекс)

Термины

строка

Строка, в которой выполняется сопоставление.

regex

Регулярное выражение.

индекс

Индекс соответствующей группы для возврата.

Использование

Используйте функцию REGEX_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения соответствующей группы, определённой параметром индекса (где индекс — параметр, начинающийся с 1). Функция использует форму регулярных выражений Java.

Функция возвращает строку, соответствующую соответствующей группе в указанной позиции индекса. Если соответствующего выражения в этой позиции нет, возвращается NULL.

Пример

В этом примере будет возвращена строка '192.168.1.5'.

REGEX_EXTRACT('192.168.1.5:8020', '(.*):(.*)', 1);

REGEX_EXTRACT_ALL

Выполняет сопоставление с регулярным выражением и извлекает все соответствующие группы.

Синтаксис

REGEX_EXTRACT_ALL (строка, regex)

Термины

строка

Строка, в которой выполняется сопоставление.

regex

Регулярное выражение.

Использование

Используйте функцию REGEX_EXTRACT_ALL для выполнения сопоставления с регулярным выражением и извлечения всех соответствующих групп. Функция использует форму регулярных выражений Java.

Функция возвращает кортеж, где каждый элемент представляет соответствующее выражение. Если соответствия нет, возвращается пустой кортеж.

Пример

В этом примере будет возвращён кортеж (192.168.1.5,8020).

REGEX_EXTRACT_ALL('192.168.1.5:8020', '(.*)\:(.*)');

REPLACE

Заменяет существующие символы в строке новыми символами.

Синтаксис

REPLACE(строка, 'regExp', 'newChar');

Термины

строка

Строка, подлежащая обновлению.

'regExp'

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

'newChar'

Новые символы, заменяющие существующие, в кавычках.

Использование

Используйте функцию REPLACE для замены существующих символов в строке новыми символами.

Например, чтобы изменить "open source software" на "open source wiki", используйте это выражение: REPLACE(строка,'software','wiki')

Обратите внимание, что функция REPLACE внутренне реализуется с помощью java.string.replaceAll(String regex, String replacement), где 'regExp' и 'newChar' передаются в качестве первого и второго аргумента соответственно. Если вы хотите заменить специальные символы, такие как '[', в строковом литерале, необходимо экранировать их в 'regExp', добавив перед ними двойные обратные слеши (например, '\\[').

RTRIM

Возвращает копию строки с удалёнными только заключительными пробелами.

Синтаксис

RTRIM(выражение)

Термины

выражение

Выражение, результатом которого является chararray.

Использование

Используйте функцию RTRIM для удаления заключительных пробелов из строки.

SPRINTF

Форматирует набор значений в соответствии с шаблоном в стиле printf, используя библиотеку native Java Formatter.

Синтаксис

SPRINTF(формат, [...значения])

Термины

формат

Строка в стиле printf, описывающая шаблон.

значения

Значения для вставки в шаблон. Должен быть элемент кортежа для каждого местаholders форматирования, и он должен иметь правильный тип: int или long для целочисленных форматов, таких как %d; float или double для десятичных форматов, таких как %f; и long для форматов дат/времени, таких как %t.

Использование

Используйте функцию SPRINTF для форматирования строки в соответствии с шаблоном. Например, SPRINTF("part-%05d", 69) вернёт 'part-00069'.

Спецификация формата строки

арг1

арг2

арг3

SPRINTF(формат, арг1, арг2)

примечания

'%8s|%8d|%-8s'

1234567

1234567

'yay'

' 1234567| 1234567|yay '

Строки форматируются с помощью %s, целые числа с %d. Типы преобразуются при необходимости (здесь int -> строка).

(значение null)

1234567

1234567

'yay'

(значение null)

Возвращает null (без ошибок или предупреждений) при null формате строки.

'%8s|%8d|%-8s'

1234567

(значение null)

'yay'

(значение null)

Возвращает null (без ошибок или предупреждений), если какой-либо аргумент имеет значение null.

'%8.3f|%6x'

123.14159

665568

' 123.142| a27e0'

Форматирование чисел с плавающей точкой/двойной точностью с помощью %f, шестнадцатеричных целых чисел с помощью %x (есть и другие -- см. документацию Java)

'%,+10d|%(06d'

1234567

-123

'+1,234,567|(0123)'

Для чисел используются префиксы модификаторов: , для разделителей тысяч в соответствии с локалью, 0 для нулевого заполнения; + для всегда отображения знака «плюс» для положительных чисел; пробел для вставки пробела перед положительными числами; ( для указания отрицательных чисел в скобках (в стиле бухгалтерского учета).

'%2$5d: %3$6s %1$3s %2$4x (%<4X)'

'the'

48879

'wheres'

'48879: wheres the beef (BEEF)'

Ссылайтесь на аргументы позиционно и столько раз, сколько нужно, используя %(pos)$.... Используйте %<... для ссылки на ранее указанный аргумент.

'Launch Time: %14d %s'

ToMilliSeconds(CurrentTime())

ToString(CurrentTime(), 'yyyy-MM-dd HH:mm:ss Z')

'Launch Time: 1400164132000 2014-05-15 09:28:52 -0500'

Вместо этого используйте ToString для форматирования даты/времени и SPRINTF для вывода результатов.

'%8s|%-8s'

1234567

MissingFormatArgumentException: Format specifier '%-8s'

Вы должны указать аргументы для всех спецификаторов

'%8s'

1234567

'ignored'

'also'

1234567

Можно передавать больше аргументов

Примечание: хотя форматировщик Java (и, следовательно, эта функция) предлагает спецификатор %t для элементов даты/времени, его лучше избегать: он громоздкий, вывод и обработка часового пояса могут отличаться от ожидаемого, и он не принимает объекты datetime из Pig. Вместо этого просто подготовьте даты с помощью UDF ToString, как показано.

STARTSWITH

Проверяет входные данные, чтобы определить, начинается ли первый аргумент со строки во втором.

Синтаксис

STARTSWITH(строка, сравнение)

Термины

строка

Строка, подлежащая проверке.

сравнение

Строка для сравнения.

Использование

Используйте функцию STARTSWITH для определения, начинается ли первый аргумент со строки во втором.

Например, STARTSWITH ('foobar', 'foo') вернёт true, а STARTSWITH ('foobar', 'bar') вернёт false.

STRSPLIT

Разбивает строку вокруг совпадений заданного регулярного выражения.

Синтаксис

STRSPLIT(строка, regex, limit)

Термины

строка

Строка, которая должна быть разделена.

regex

Регулярное выражение.

limit

Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, поэтому значение аргумента означает максимальную длину кортежа результата. Последний элемент кортежа результата будет содержать весь вход после последнего совпадения.

Если значение отрицательное, никаких ограничений на длину кортежа результата не накладывается.

Если значение равно нулю, никаких ограничений на длину кортежа результата не накладывается, и завершающие пустые строки (если есть) будут удалены.

Использование

Используйте функцию STRSPLIT для разделения строки вокруг совпадений заданного регулярного выражения.

Например, для строки (open:source:software), STRSPLIT (строка, ':',2) вернёт ((open,source:software)), а STRSPLIT (строка, ':',3) вернёт ((open,source,software)).

STRSPLITTOBAG

Разделяет строку по совпадениям заданного регулярного выражения и возвращает набор данных.

Синтаксис

STRSPLITTOBAG(строка, regex, limit)

Термины

строка

Строка, которая должна быть разделена.

regex

Регулярное выражение.

limit

Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более limit-1 раз, поэтому значение аргумента означает максимальный размер набора результата. Последний кортеж набора результата будет содержать весь вход после последнего совпадения.

Если значение отрицательное, никаких ограничений на размер набора результата не накладывается.

Если значение равно нулю, никаких ограничений на размер набора результата не накладывается, и завершающие пустые строки (если есть) будут удалены.

Использование

Используйте функцию STRSPLITTOBAG для разделения строки по совпадениям заданного регулярного выражения.

Например, для строки (open:source:software), STRSPLITTOBAG (строка, ':',2) вернёт {(open),(source:software)}, а STRSPLITTOBAG (строка, ':',3) вернёт {(open),(source),(software)}.

SUBSTRING

Возвращает подстроку из заданной строки.

Синтаксис

SUBSTRING(строка, начальныйИндекс, конечныйИндекс)

Термины

строка

Строка, из которой будет извлечена подстрока.

начальныйИндекс

Индекс (тип целое число) первой буквы подстроки.

Индекс строки начинается с нуля (0).

конечныйИндекс

Индекс (тип целое число) символа, следующего за последним символом подстроки.

Использование

Используйте функцию SUBSTRING для возврата подстроки из заданной строки.

Для поля с именем alpha, значение которого равно ABCDEF, чтобы вернуть подстроку BCD, используйте следующее выражение: SUBSTRING(alpha,1,4). Обратите внимание, что 1 — индекс B (первый символ подстроки), а 4 — индекс E (символ, следующий за последним символом подстроки).

TRIM

Возвращает копию строки с удаленными начальными и конечными пробелами.

Синтаксис

TRIM(выражение)

Термины

выражение

Выражение, результат которого — chararray.

Использование

Используйте функцию TRIM, чтобы удалить начальные и конечные пробелы из строки.

UCFIRST

Возвращает строку с первым символом, преобразованным в верхний регистр.

Синтаксис

UCFIRST(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию UCFIRST для преобразования только первого символа строки в верхний регистр.

UPPER

Возвращает строку, преобразованную в верхний регистр.

Синтаксис

UPPER(выражение)

Термины

выражение

Выражение, результат которого имеет тип chararray.

Использование

Используйте функцию UPPER для преобразования всех символов строки в верхний регистр.

UniqueID

Возвращает уникальный идентификатор для каждой записи в алиасе.

Использование

UniqueID генерирует уникальный идентификатор для каждой записи. Идентификатор имеет вид "taskindex-последовательность"

Функции работы со временем

Для общей информации об операциях с типами datetime, см. Спецификацию Java API, класс Java Date, и класс JODA DateTime. А для информации о форматах дат и времени ISO, пожалуйста, обратитесь к форматам дат и времени.

AddDuration

Возвращает результат сложения объекта DateTime и объекта Duration.

Синтаксис

AddDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

Строка длительности в формате ISO 8601.

Использование

Используйте функцию AddDuration для создания нового объекта datetime путем добавления некоторой длительности к заданному объекту datetime.

CurrentTime

Возвращает объект DateTime текущего времени.

Синтаксис

CurrentTime()

Использование

Используйте функцию CurrentTime для генерации объекта datetime текущего временного штампа с точностью до миллисекунды.

DaysBetween

Возвращает количество дней между двумя объектами DateTime.

Синтаксис

DaysBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию DaysBetween для получения количества дней между двумя заданными объектами datetime.

GetDay

Возвращает день месяца из объекта DateTime.

Синтаксис

GetDay(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetDay для извлечения дня месяца из заданного объекта datetime.

GetHour

Возвращает час дня из объекта DateTime.

Синтаксис

GetHour(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetHour для извлечения часа дня из заданного объекта datetime.

GetMilliSecond

Возвращает миллисекунду секунды из объекта DateTime.

Синтаксис

GetMilliSecond(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMilliSecond для извлечения миллисекунды секунды из заданного объекта datetime.

GetMinute

Возвращает минуту часа из объекта DateTime.

Синтаксис

GetMinute(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMinute для извлечения минуты часа из заданного объекта datetime.

GetMonth

Возвращает месяц года из объекта DateTime.

Синтаксис

GetMonth(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetMonth для извлечения месяца года из заданного объекта datetime.

GetSecond

Возвращает секунду минуты из объекта DateTime.

Синтаксис

GetSecond(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetSecond для извлечения секунды минуты из заданного объекта datetime.

GetWeek

Возвращает номер недели года из объекта DateTime.

Синтаксис

GetWeek(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetWeek для извлечения номера недели года из заданного объекта datetime. Обратите внимание, что неделя года может отличаться от года.

GetWeekYear

Возвращает номер недели года из объекта DateTime.

Синтаксис

GetWeekYear(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetWeekYear для извлечения номера недели года из заданного объекта datetime. Обратите внимание, что неделя года может отличаться от года.

GetYear

Возвращает год из объекта DateTime.

Синтаксис

GetYear(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию GetYear для извлечения года из заданного объекта datetime.

HoursBetween

Возвращает количество часов между двумя объектами DateTime.

Синтаксис

HoursBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию HoursBetween для получения количества часов между двумя заданными объектами datetime.

MilliSecondsBetween

Возвращает количество миллисекунд между двумя объектами DateTime.

Синтаксис

MilliSecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MilliSecondsBetween для получения количества миллисекунд между двумя заданными объектами datetime.

MinutesBetween

Возвращает количество минут между двумя объектами DateTime.

Синтаксис

MinutesBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MinutsBetween для получения количества минут между двумя заданными объектами datetime.

MonthsBetween

Возвращает количество месяцев между двумя объектами DateTime.

Синтаксис

MonthsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию MonthsBetween для получения количества месяцев между двумя заданными объектами datetime.

SecondsBetween

Возвращает количество секунд между двумя объектами DateTime.

Синтаксис

SecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию SecondsBetween для получения количества секунд между двумя заданными объектами datetime.

SubtractDuration

Возвращает результат вычитания объекта Duration из объекта DateTime.

Синтаксис

SubtractDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

Строка продолжительности в формате ISO 8601.

Использование

Функция AddDuration используется для создания нового объекта datetime, добавив определённую продолжительность к заданному объекту datetime.

ToDate

Возвращает объект DateTime в соответствии с параметрами.

Синтаксис

ToDate(milliseconds)

ToDate(iosstring)

ToDate(userstring, format)

ToDate(userstring, format, timezone)

Термины

millseconds

Смещение от 1970-01-01T00:00:00.000Z в миллисекундах (положительное или отрицательное).

isostring

Строка даты и времени в формате ISO 8601.

userstring

Строка даты и времени в пользовательском формате.

format

Шаблон формата даты и времени (см. класс Java SimpleDateFormat).

timezone

Строка часового пояса. Может быть использовано как смещение от UTC, так и формат, основанный на местоположении. Внутренне часовой пояс будет преобразован в формат смещения от UTC.

См. документацию Joda-Time для доступных идентификаторов часовых поясов.

Использование

Используйте функцию ToDate для создания объекта DateTime. Обратите внимание, что если часовой пояс не указан с помощью строки даты и времени ISO или параметром timezone, будет использован значение по умолчанию.

ToMilliSeconds

Возвращает количество миллисекунд, прошедших с 1 января 1970 года, 00:00:00.000 по Гринвичу, для объекта DateTime.

Синтаксис

ToMilliSeconds(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию ToMilliSeconds для преобразования DateTime в количество миллисекунд, прошедших с 1 января 1970 года 00:00:00.000 по Гринвичу.

ToString

ToString преобразует объект DateTime в строку ISO или в строку с пользовательским форматом.

Синтаксис

ToString(datetime [, строка формата])

Термины

datetime

Объект datetime.

строка формата

Шаблон формата даты и времени (см. класс Java SimpleDateFormat).

Использование

Используйте функцию ToString для преобразования DateTime в строку с пользовательским форматом.

ToUnixTime

Возвращает Unix Time как целое число long для объекта DateTime. UnixTime — это количество секунд, прошедших с 1 января 1970 года, 00:00:00.000 по Гринвичу.

Синтаксис

ToUnixTime(datetime)

Термины

datetime

Объект datetime.

Использование

Используйте функцию ToUnixTime для преобразования DateTime в Unix Time.

WeeksBetween

Возвращает количество недель между двумя объектами DateTime.

Синтаксис

WeeksBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию WeeksBetween для получения количества недель между двумя заданными объектами datetime.

YearsBetween

Возвращает количество лет между двумя объектами DateTime.

Синтаксис

YearsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

Другой объект datetime.

Использование

Используйте функцию YearsBetween для получения количества лет между двумя заданными объектами datetime.

Функции кортежей, множеств и словарей

TOTUPLE

Преобразует одно или несколько выражений в тип кортеж.

Синтаксис

TOTUPLE(expression [, expression ...])

Термины

expression

Выражение любого типа данных.

Использование

Используйте функцию TOTUPLE для преобразования одного или нескольких выражений в кортеж.

См. также: тип данных кортеж и Операторы построения типов

Пример

В этом примере поля f1, f2 и f3 преобразуются в кортеж.

a = LOAD 'student' AS (f1:chararray, f2:int, f3:float);
DUMP a;

(John,18,4.0)
(Mary,19,3.8)
(Bill,20,3.9)
(Joe,18,3.8)

b = FOREACH a GENERATE TOTUPLE(f1,f2,f3);
DUMP b;

((John,18,4.0))
((Mary,19,3.8))
((Bill,20,3.9))
((Joe,18,3.8))

TOBAG

Преобразует одно или несколько выражений в тип множество.

Синтаксис

TOBAG(expression [, expression ...])

Термины

expression

Выражение любого типа данных.

Использование

Используйте функцию TOBAG для преобразования одного или нескольких выражений в отдельные кортежи, которые затем помещаются в множество.

См. также: тип данных множество и Операторы построения типов

Пример

В этом примере поля f1 и f3 преобразуются в кортежи, которые затем помещаются в множество.

a = LOAD 'student' AS (f1:chararray, f2:int, f3:float);
DUMP a;

(John,18,4.0)
(Mary,19,3.8)
(Bill,20,3.9)
(Joe,18,3.8)

b = FOREACH a GENERATE TOBAG(f1,f3);
DUMP b;

({(John),(4.0)})
({(Mary),(3.8)})
({(Bill),(3.9)})
({(Joe),(3.8)})

TOMAP

Преобразует пары выражений ключ/значение в словарь.

Синтаксис

TOMAP(key-expression, value-expression [, key-expression, value-expression ...])

Термины

key-expression

Выражение типа chararray.

value-expression

Выражение любого типа, поддерживаемого словарем.

Использование

Используйте функцию TOMAP для преобразования пар выражений в словарь. Обратите внимание на следующее:

  • Вы должны предоставить чётное количество выражений в качестве параметров
  • Элементы должны соответствовать правилам типа словаря:
    • Каждый нечётный элемент (key-expression) должен быть типа chararray, так как только chararray могут быть ключами в словаре
    • Каждый чётный элемент (value-expression) может быть любого типа, поддерживаемого словарем.

См. также: тип данных словарь и Операторы построения типов

Пример

В этом примере используются имена студентов (тип chararray) и оценки студентов (тип float) для создания трёх словарей.

A = load 'students' as (name:chararray, age:int, gpa:float);
B = foreach A generate TOMAP(name, gpa);
store B into ‘results’;

Input (students)
joe smith 20 3.5
amy chen 22 3.2
leo allen 18 2.1

Output (results)
[joe smith#3.5]
[amy chen#3.2]
[leo allen#2.1]

TOP

Возвращает верхние n кортежей из множества кортежей.

Синтаксис

TOP(topN,column,relation)

Термины

topN

Количество возвращаемых верхних кортежей (тип integer).

column

Столбец кортежа, значения которого сравниваются (0 обозначает первый столбец).

relation

Отношение (множество кортежей), содержащее столбец кортежей.

Использование

Функция TOP возвращает множество, содержащее верхние N кортежей из входного множества, где N задаётся первым параметром функции. Сравнение кортежей выполняется на основе одного столбца кортежа. Позиция столбца определяется вторым параметром функции. Функция предполагает, что все кортежи в множестве содержат элемент одного и того же типа в сравниваемом столбце.

По умолчанию функция TOP использует порядок убывания. Но он может быть настроен с помощью оператора DEFINE.

DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order

Пример

В этом примере возвращаются 10 наиболее часто встречающихся значений.

DEFINE asc TOP('ASC'); -- ascending order
DEFINE desc TOP('DESC'); -- descending order

A = LOAD 'data' as (first: chararray, second: chararray);
B = GROUP A BY (first, second);
C = FOREACH B generate FLATTEN(group), COUNT(A) as count;
D = GROUP C BY first; -- again group by first
topResults = FOREACH D {
    result = asc(10, 1, C); -- and retain top 10 (in ascending order) occurrences of 'second' in first  
    GENERATE FLATTEN(result);
}

bottomResults = FOREACH D {
    result = desc(10, 1, C); -- and retain top 10  (in descending order) occurrences of 'second' in first  
    GENERATE FLATTEN(result);
}

© 2007–2016 Apache Software Foundation
Licensed under the Apache Software License version 2.0.
https://pig.apache.org/docs/r0.14.0/func.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API