Я бы хотел использовать Apache Pig для построения большого ключа -> отображения значений, поиска объектов на карте и перебора ключей.Тем не менее, даже кажется, что нет синтаксиса для выполнения этих вещей;Я проверил руководство, вики, пример кода, книгу Elephant, Google и даже попытался разобрать исходный текст парсера.Каждый пример загружает литералы карты из файла ... и затем никогда не использует их.Как вы можете использовать карты Свиньи?
Во-первых, кажется, что нет способа загрузить файл CSV с двумя столбцами непосредственно в карту.Если у меня есть простой map.csv
:
1,2
3,4
5,6
И я пытаюсь загрузить его как карту:
m = load 'map.csv' using PigStorage(',') as (M: []);
dump m;
Я получаю три пустых кортежа:
()
()
()
Поэтому я пытаюсь загрузить кортежи, а затем сгенерировать карту:
m = load 'map.csv' using PigStorage(',') as (key:chararray, val:chararray);
b = foreach m generate [key#val];
ERROR 1000: Error during parsing. Encountered " "[" "[ "" at line 1, column 24.
...
Многие вариации синтаксиса также терпят неудачу (например, generate [$0#$1]
).
ОК, поэтому я превращаю свою карту в буквальный формат карты Свиньи как map.pig
:
[1#2]
[3#4]
[5#6]
И загружаю ее:
m = load 'map.pig' as (M: []);
Теперь давайте загрузимнекоторые ключи и попробуйте поискать:
k = load 'keys.csv' as (key);
dump k;
3
5
1
c = foreach k generate m#key; /* Or m[key], or... what? */
ERROR 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
Хм, хорошо, возможно, так как в этом участвуют два отношения, нам нужно объединение:
c = join k by key, m by /* ...um, what? */ $0;
dump c;
ERROR 1068: Using Map as key not supported.
c = join k by key, m by m#key;
dump c;
Error 1000: Error during parsing. Invalid alias: m in {M: map[ ]}
Fail.Как мне обратиться к ключу (или значению) карты?Синтаксис схемы карты, кажется, не позволяет даже назвать ключ и значение (в списке рассылки сказано, что нет способа назначать типы).
Наконец, я просто хотел бы найти все, что ониключи на моей карте:
d = foreach m generate ...oh, forget it.
Тип карты Свиньи наполовину испечен?Чего мне не хватает?