Spec-Zone.ru › Apache Pig 0.15

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

  • Введение
  • Динамические вызывающие функции
  • Функции 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
  • Hive UDF
    • Синтаксис
    • Термины
    • Пример

Введение

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.

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

Возможность использования вызывающих функций с аргументами массивов делает доступными такие методы, как те, что находятся в org.apache.commons.math.stat.StatUtils (например, для обработки результатов группирования наборов данных). Это полезно, но следует учесть: полученная пользовательская функция не будет оптимизирована для 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 создаёт одну строку из элементов выборки, аналогично функции GROUP_CONCAT SQL. Учтите следующее:

  • Выборка может иметь произвольный размер, в то время как строки в 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 (выражение, выражение, [...выражение])

Термины

выражение

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

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

Используйте функцию 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)

COUNT

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

Синтаксис

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

Термины

выражение

Выражение типа выборка.

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

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

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

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

Пример

В этом примере подсчитываются кортежи в выборке (см. оператор 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

COUNT

long

long

long

long

long

long

COUNT_STAR

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

Синтаксис

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

Термины

выражение

Выражение типа выборка.

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

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

COUNT_STAR включает значения NULL в вычисление подсчёта (в отличие от COUNT, которая игнорирует значения NULL).

Пример

В этом примере COUNT_STAR используется для подсчёта кортежей в выборке.

X = FOREACH B GENERATE COUNT_STAR(A);

DIFF

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

Синтаксис

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

Термины

выражение

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

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

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

Пример

В этом примере DIFF сравнивает кортежи в двух выборках.

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)})

IsEmpty

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

Синтаксис

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

Термины

выражение

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

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

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

Пример

В этом примере находятся все студенты с 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);

MAX

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

Синтаксис

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

Термины

выражение

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

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

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

Функция 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

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

Синтаксис

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

Термины

выражение

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

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

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

Функция 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

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

Синтаксис

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

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

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

Термины

выражение1

Префикс для извлечения или шаблон регулярных выражений для извлечения

выражение2

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

выражение3

Логический флаг, указывающий, следует ли включать или исключать соответствующие столбцы

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

Пример:

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}
DEFINE pluckNegative PluckTuple('a::','false');
d = foreach c generate FLATTEN(pluckNegative(*));
describe d;
d: {plucked::b::x: bytearray,plucked::b::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

возвращает количество пар ключ/значение в 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()

Термины

none

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

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

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;

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

  • Выводит сообщение об ошибке при выполнении второго скрипта: «ERROR 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( ['schema'] )

JsonStorage( )

Термины

schema

Необязательная схема 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()

Термины

none

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

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

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

Пример

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

STORE X INTO 'output' USING PigDump();

PigStorage

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

Синтаксис

PigStorage( [field_delimiter] , ['options'] )

Термины

field_delimiter

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

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

'options'

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

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

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

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

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

Утверждения загрузки/сохранения

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

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

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

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

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

Схемы

Если указан параметр схемы, при сохранении данных в выходном каталоге создается скрытый файл «.pig_schema». Он используется PigStorage (с параметром -schema или без него) во время загрузки для определения имён и типов полей данных без необходимости явного предоставления схемы пользователем в качестве пункта «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]
    • Пустой словарь допустим: []

Если утверждение загрузки указывает схему, 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 загружает данные со сложным типом данных — мешком словарей и double.

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()

Термины

нет

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

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

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, соответствующие этому regex на 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 Возвратить значения ячеек, у которых время создания равно этому значению
  • -includeTimestamp=Запись будет включать время отметки после rowkey при сохранении (rowkey, время отметки, ...)
  • -includeTombstone=Запись будет включать метку tombstone после rowKey и time-stamp (если включен) (rowkey, [time-stamp,] tombstone, ...)

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

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'])

Термины

схема

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

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

имя записи

При сохранении мешка кортежей с 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 никакой дополнительной информации. Но иногда удобно вручную указать схему AvroStorge. Примеры ручной спецификации схемы с 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, а столбцы в этой строке могут быть сгруппированы различными статическими или подстановочными способами. Существует базовая функциональность подстановки для группировки различных семейств/квалификаторов столбцов в словарь для LOAD или сериализации словаря в группу семейств/квалификаторов столбцов при STORE.

Синтаксис

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

Аргументы

'columns'

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

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

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

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

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

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

'options'

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

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

  • (-c|--caster) LoadStoreCasterImpl Реализация LoadStoreCaster для использования при сериализации типов в Accumulo, обычно AccumuloBinaryConverter или UTF8StringConverter, по умолчанию UTF8StorageConverter.
  • (-auths|--authorizations) auth1,auth2... Список Accumulo authorizations, разделенных запятыми, для использования при чтении данных из Accumulo. По умолчанию используется пустой набор authorizations (ни один).
  • (-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 присутствуют jar-файлы Accumulo. Это легко достигается с помощью переменной среды 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 значениеA -optionB значениеB -optionC»). Текущие параметры применимы только к операции сохранения, а не к загрузке.

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

  • --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 для возврата гиперболического тангенса выражения.

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

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

  • Имена функций Pig чувствительны к регистру и записываются в ВЕРХНЕМ РЕГИСТРЕ.

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

  • Pig может обрабатывать результаты иначе, чем указано в Спецификации API Java. Если любой из входных параметров имеет значение 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_EXTRACT для выполнения сопоставления с регулярным выражением и извлечения сопоставленной группы, определённой параметром индекса (где индекс является параметром с основанием 1). Функция использует форму регулярных выражений Java.

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

Пример

Этот пример вернёт строку '192.168.1.5'.

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

REGEX_EXTRACT_ALL

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

Синтаксис

REGEX_EXTRACT_ALL (строка, регулярноеВыражение)

Термины

строка

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

регулярноеВыражение

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

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

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

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

Пример

Этот пример вернёт кортеж (192.168.1.5,8020).

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

REPLACE

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

Синтаксис

REPLACE(строка, 'регулярноеВыражение', 'новыйСимвол');

Термины

строка

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

'регулярноеВыражение'

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

'новыйСимвол'

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

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

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

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

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

RTRIM

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

Синтаксис

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

Термины

выражение

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

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

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

SPRINTF

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

Синтаксис

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

Термины

формат

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

значения

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

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

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

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

arg1

arg2

arg3

SPRINTF(формат, arg1, arg2)

примечания

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

1234567

1234567

'yay'

' 1234567| 1234567|yay '

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

(нулевое значение)

1234567

1234567

'yay'

(нулевое значение)

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

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

1234567

(нулевое значение)

'yay'

(нулевое значение)

Возвращает 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: Форматный спецификатор '%-8s'

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

'%8s'

1234567

'ignored'

'also'

1234567

В порядке предоставление больше аргументов, чем нужно

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

STARTSWITH

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

Синтаксис

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

Термины

строка

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

сравнение

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

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

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

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

STRSPLIT

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

Синтаксис

STRSPLIT(строка, регулярное_выражение, ограничение)

Термины

строка

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

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

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

ограничение

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

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

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

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

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

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

STRSPLITTOBAG

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

Синтаксис

STRSPLITTOBAG(строка, регулярное_выражение, ограничение)

Термины

строка

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

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

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

ограничение

Если значение положительное, шаблон (скомпилированное представление регулярного выражения) применяется не более 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, см. Спецификацию API Java, класс 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.

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

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

MonthsBetween

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

Синтаксис

MonthsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

SecondsBetween

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

Синтаксис

SecondsBetween(datetime1, datetime2)

Термины

datetime1

Объект datetime.

datetime2

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

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

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

SubtractDuration

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

Синтаксис

SubtractDuration(datetime, duration)

Термины

datetime

Объект datetime.

duration

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

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

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

ToDate

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

Синтаксис

ToDate(миллисекунды)

ToDate(iosстрока)

ToDate(пользовательскаястрока, формат)

ToDate(пользовательскаястрока, формат, часовойпояс)

Термины

миллисекунды

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

isoстрока

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

пользовательскаястрока

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

формат

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

часовойпояс

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

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

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

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

ToMilliSeconds

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

Синтаксис

ToMilliSeconds(datetime)

Термины

datetime

Объект datetime.

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

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

ToString

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

Синтаксис

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

Термины

datetime

Объект datetime.

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

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

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

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

ToUnixTime

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

Синтаксис

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(выражение [, выражение ...])

Термины

выражение

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

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

Используйте функцию 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(выражение [, выражение ...])

Термины

выражение

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

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

Используйте функцию 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(выражение-ключ, выражение-значение [, выражение-ключ, выражение-значение ...])

Термины

выражение-ключ

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

выражение-значение

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

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

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

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

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

Пример

В этом примере используются имена студентов (тип 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,столбец,отношение)

Термины

topN

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

столбец

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

отношение

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

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

Функция 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);
}

Hive UDF

Pig вызывает все типы Hive UDF, включая UDF, GenericUDF, UDAF, GenericUDAF и GenericUDTF. В зависимости от используемого Hive UDF, необходимо объявить его в Pig с помощью HiveUDF (обрабатывает UDF и GenericUDF), HiveUDAF (обрабатывает UDAF и GenericUDAF), HiveUDTF (обрабатывает GenericUDTF).

Синтаксис

HiveUDF, HiveUDAF, HiveUDTF используют одинаковый синтаксис.

HiveUDF(name[, constant parameters])

Термины

name

Имя Hive UDF. Это может быть полное имя класса Hive UDF/UDTF/UDAF, или зарегистрированное короткое имя в Hive FunctionRegistry (большинство встроенных Hive UDF используют это).

constant parameters

Необязательная кортеж, представляющая константные параметры Hive UDF/UDTF/UDAF. Если Hive UDF требует константного параметра, нет другого способа, которым Pig может передать эту информацию в Hive, так как схема Pig не содержит информации о том, является ли параметр константой. Нулевой элемент в кортеже означает, что этот элемент не является константой. Не нулевой элемент представляет константное поле. Тип данных для элемента определяется анализатором констант Pig.

Пример

HiveUDF

define sin HiveUDF('sin');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = foreach A generate sin(gpa);
  

HiveUDTF

define explode HiveUDTF('explode');
A = load 'mydata' as (a0:{(b0:chararray)});
B = foreach A generate flatten(explode(a0));
  

HiveUDAF

define avg HiveUDAF('avg');
A = LOAD 'student' as (name:chararray, age:int, gpa:double);
B = group A by name;
C = foreach B generate group, avg(A.age);
  

HiveUDAF с константным параметром

define in_file HiveUDF('in_file', '(null, "names.txt")');
A = load 'student' as (name:chararray, age:long, gpa:double);
B = foreach A generate in_file(name, 'names.txt');

В этом примере мы передаем (null, "names.txt") в конструктор UDF in_file, что означает, что первый параметр является обычным, а второй – константным. names.txt может быть заключен в двойные кавычки (в отличие от другого синтаксиса Pig), или в одинарные. Обратите внимание, что нам нужно снова передать 'names.txt' в строке 3. Это выглядит глупо, но нам нужно это сделать, чтобы заполнить семантический разрыв между Pig и Hive. Нам нужно передать константу в конвейер данных в строке 3, что аналогично Pig UDF. Код инициализации в Hive UDF принимает ObjectInspector, который фиксирует тип данных и является ли параметр константой. Однако код инициализации в Pig принимает схему, которая фиксирует только первое. Нам нужно использовать дополнительный механизм (параметр конструктора), чтобы передать последнее.

Примечание: несколько Hive 0.14 UDF содержат ошибку, которая влияет на Pig и исправлена в Hive 1.0. Вот список: compute_stats, context_ngrams, count, ewah_bitmap, histogram_numeric, collect_list, collect_set, ngrams, case, in, named_struct, stack, percentile_approx.

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

Spec-Zone.ru

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