2016-09-14 3 views
0

Я написал код свиньи, где я хочу сопоставить столбец с несколькими строками. Например.ОШИБКА 2998: необработанная внутренняя ошибка. null - Apache Pig

A = FOREACH A1 GENERATE 
    c1, c2, c3, 

--i have substituted junk values-- 

case 
when ( (
     column_name matches '.*abc.*' 
    OR column_name matches '.*sdf.*' 
    OR column_name matches '.*bcd.*' 
    OR column_name MATCHES '.*def.*' 
    OR column_name MATCHES '.*efg.*' 
    OR column_name MATCHES '.*ggg.*' 
    OR column_name MATCHES '.*ghi.*' 
    OR column_name MATCHES '.*hij.*' 
    OR column_name MATCHES '.*ijk.*' 
    OR column_name MATCHES '.*jkl.*' 
    OR column_name MATCHES '.*klm.*' 
    OR column_name MATCHES '.*lmn.*' 
    or column_name matches '.*mno.*' 
    or column_name matches '.*mnb.*' 
    or column_name matches '.*opq.*' 
    or column_name matches '.*pqr.*' 
    or column_name matches '.*qrs.*' 
    or column_name matches '.*stuv.*' 
    or column_name matches '.*tuvw.*' 
    or column_name matches '.*wxy.*' 
    or column_name matches '.*tuvwx.*' 
    or column_name matches '.*xyz.*' 
    . 
    . 
    . 
    . 
    . 
    ) then 1 
      else 0 as c4; 

Следует отметить, что, когда число ИЛИ column_name МАТЧИ «---» заявления выходят за рамки 672, сценарий свинья не запускается с ошибкой:

Pig Stack Trace 
--------------- 
ERROR 2998: Unhandled internal error. null 

java.lang.StackOverflowError 
     at java.util.zip.Deflater.ensureOpen(Deflater.java:543) 
     at java.util.zip.Deflater.deflate(Deflater.java:426) 
     at java.util.zip.Deflater.deflate(Deflater.java:352) 
     at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:251) 
     at java.util.zip.DeflaterOutputStream.write(DeflaterOutputStream.java:211) 
     at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1876) 
     at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1840) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1533) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
     at java.util.ArrayList.writeObject(ArrayList.java:742) 
     at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
     at java.util.ArrayList.writeObject(ArrayList.java:742) 
     at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
     at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547) 
     at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508) 
     at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
     at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
     at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
     at java.util.ArrayList.writeObject(ArrayList.java:742) 
     at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

Просьба предложить решение или альтернативу для удовлетворения этого требования.

ответ

0

Возможно, вы захотите написать специальную функцию фильтра 1, где вы больше контролируете потребление ОЗУ. Вполне возможно, что вам не нужен RegEx, а поиск подстроки.

+0

UPD: вы генерируете, а не фильтр, поэтому должна быть функция eval https://pig.apache.org/docs/r0.16.0/udf.html#eval-functions – patrungel

+0

Итак, в основном мне нужно написать UDF и найдите значение столбца (подстроку) в требуемом наборе значений, например ('abc | def | ghi | jkl | mno'). Это правильное понимание @patrungel? – Suyog

+0

Правильно для написания UDF, но это не для поиска значения столбца в вашем списке; по крайней мере, у меня сложилось впечатление, что вы ищете шаблоны _in_ значений. – patrungel