2012-01-09 4 views
4

У меня есть простое соотношение, v в Apache Pig:Невозможно извлечь значения из карты в апаче свиньи

dump v; 

(151364,[ 'ref'#'R813','highway'#'secondary', 'name:ga'#'Lána Chairdif', 'name'#'Cardiff Lane'],(31015271, 31053762)) 
(151368,[ 'ref'#'N1', 'oneway'#'yes','designation'#'Buses Only', 'highway'#'trunk', 'motor_vehicle'#'designated', 'name:ga'#'Cearnóg Pharnell Thoir', 'maxspeed'#'30', 'name'#'Parnell Square East'],(389365, 540403072)) 
(151596,[ 'name:en'#'Liffey', 'boundary'#'administrative', 'name:ga'#'An Life','admin_level'#'8', 'name'#'Liffey', 'waterway'#'river'],(1347749, 1426049020, 1347745, 1426049019, 1347742, 900075612)) 
(367947,[ 'maxspeed'#'80', 'ref'#'L2223','highway'#'tertiary'],(13259933, 2384217, 335978958)) 
(367952,['created_by'#'YahooApplet 1.0', 'name'#'Charnwood Avenue', 'highway'#'residential'],(2384386, 25963471, 14949594, 2384385, 6146344, 2384254)) 
(508603,[ 'ref'#'L3018','highway'#'tertiary', 'maxspeed'#'50', 'name'#'Shelerin Road'],(2854184, 2854168, 335978984, 2853307, 2384254, 335978978, 335978975, 2655735, 2655703, 392675957, 11676198, 920037194, 244531387, 2655952, 11675077)) 
(727153,[ 'ref'#'N8','highway'#'trunk', 'name'#'Merchants' Quay'],(354153, 453344873)) 
(727157,['highway'#'unclassified', 'oneway'#'yes', 'maxspeed'#'30', 'name'#'Kyle Street'],(354168, 354167)) 
(727159,['highway'#'unclassified', 'oneway'#'yes', 'maxspeed'#'30', 'name'#'North Main Street'],(354178, 465226768, 354167, 413995429, 72219131, 685537307, 1232381779, 354164)) 
(727161,[ 'maxspeed'#'30','highway'#'pedestrian', 'name'#'Maylor Street'],(1486492976, 1515360721, 1515360722, 1515345383, 1515344226, 1515344227, 1515344228, 1515344231)) 

На @ orangeoctopus то совет, я попытался восстанавливающим свои данные с любым ' в ключевых именах, и у меня есть эти данные:

(151364,[ ref#'R813', name:ga#'Lána Chairdif', name#'Cardiff Lane',highway#'secondary'],(31015271, 31053762)) 
(151368,[ motor_vehicle#'designated', name#'Parnell Square East', highway#'trunk', oneway#'yes',designation#'Buses Only', maxspeed#'30', name:ga#'Cearnóg Pharnell Thoir', ref#'N1'],(389365, 540403072)) 
(151596,[ name:en#'Liffey', boundary#'administrative', waterway#'river', name:ga#'An Life',admin_level#'8', name#'Liffey'],(1347749, 1426049020, 1347745, 1426049019, 1347742, 900075612)) 
(367947,[highway#'tertiary', maxspeed#'80', ref#'L2223'],(13259933, 2384217, 335978958)) 
(367952,[ name#'Charnwood Avenue',created_by#'YahooApplet 1.0', highway#'residential'],(2384386, 25963471, 14949594, 2384385, 6146344, 2384254)) 
(508603,[ maxspeed#'50', ref#'L3018', name#'Shelerin Road',highway#'tertiary'],(2854184, 2854168, 335978984, 2853307, 2384254, 335978978, 335978975, 2655735, 2655703, 392675957, 11676198, 920037194, 244531387, 2655952, 11675077)) 
(727153,[highway#'trunk', name#'Merchants' Quay', ref#'N8'],(354153, 453344873)) 
(727157,[ oneway#'yes', maxspeed#'30', name#'Kyle Street',highway#'unclassified'],(354168, 354167)) 
(727159,[ oneway#'yes', maxspeed#'30', name#'North Main Street',highway#'unclassified' (354178, 465226768, 354167, 413995429, 72219131, 685537307, 1232381779, 354164)) 
(727161,[highway#'pedestrian', name#'Maylor Street', maxspeed#'30'],(1486492976, 1515360721, 1515360722, 1515345383, 1515344226, 1515344227, 1515344228, 1515344231)) 

В обоих случаях v имеет ту же схему/структуру:

grunt> describe v; 
2012-01-09 22:55:34,271 [main] WARN org.apache.pig.PigServer - Encountered Warning IMPLICIT_CAST_TO_CHARARRAY 1 time(s). 
v: {id: int,tags: map[ ],nodes: (null)} 

Тогда я пытаюсь извлечь из только одно значение из tags карты:

grunt> w = foreach v generate tags#'ref';  
dump w; 

Но это только дает мне пустые данные, даже если некоторые элементы имеют данные здесь.

() 
() 
() 
() 
() 
() 
() 
() 
() 
() 

Со старой «цитировал» ключи я пытался (как на @orangeoctopus' решения

w = foreach v generate tags#'\'ref\''; 

И дал мне те же) „пустые“ данные, и не работали. (Я также пробовал другие комбинации ' и ", как "'ref'"/'"ref"'/др., Но все, кроме '\'ref\'' недействительны свиньи латинского синтаксиса)

Что происходит? Если я пытаюсь фильтровать на основе значения тега (например, filter v by tags#'highway' != ''), я ничего не получаю, что согласуется с этой проблемой, связанной с тем, что вы не можете извлечь данные с карты, я что-то не так?

ответ

4

Очень сложно!

Ваша проблема заключается в том, что ваши литеральные данные содержат одинарные кавычки. Ваша строка не ref (длиной 3 символа), это 'ref' (длиной 5 символов). Я понял это, потому что дамп карты, содержащей строки, обычно не содержит кавычек.

Таким образом, вы должны быть манипуляция включая те кавычки (вы должны избежать их \):

grunt> w = foreach v generate tags#'\'ref\'';  

Другой вариант должен был бы изменить путь ваши данные загружаемой поэтому он не включают одиночные кавычки в самих строках и вытесняет их. PigStorage не делает это бесплатно, но вы можете использовать что-то вроде REPLACE или свой собственный UDF для этого.

+0

Хорошая идея! Однако я попробовал ваше цитирование, и это не сработало. Затем я восстановил свои данные без каких-либо ключей и все еще не работал (вопрос обновлен). Есть идеи? – Rory

+0

Можете ли вы показать весь сценарий свиньи? И, возможно, вставьте несколько строк необработанных данных. –

3

Вы регулярно скачиваете данные? Странно, что есть место после [и до], когда вы сбрасываете карту.

Также проще всего сбросить все кавычки в ключ и значение в input data.Например:

входного файла

151364 [ref#R813,highway#secondary] 

Pig

a = LOAD 'data.txt' AS (id:INT, m:MAP[]); 
DUMP a; 
b = FOREACH a GENERATE m#'ref'; 
DUMP b; 

Выход

(151364,[highway#secondary,ref#R813]) 

(R813) 
+0

Я создаю текст со сценарием, и есть 3 типа строки ввода (основанный на первом элементе), поэтому каждая строка не всегда имеет одну и ту же схему, поэтому я не могу выполнить «LOAD ... В ВИДЕ ....'. – Rory

 Смежные вопросы

  • Нет связанных вопросов^_^