Апачская свинья / твиттер слон-птица Json парсер ClassCastException - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь разобрать довольно простой файл json, используя Pig и библиотеку Twitter-слона, но это превращается в очень болезненный процесс отладки.

JSON имеет следующую структуру:

oid_id: (oid:chararray), 
bookmarks: {(
  oid_id:(oid:chararray),
  id:chararray,
  creator: chararray,
  position:chararray,
  creationdate:($ate:chararray)
  )},
lastaction:(date:chararray),
settings:(preferredlanguage:chararray),
userid:chararray

Пример строки:

{ "oid_id": { "OID": "573239f905474a686e2333f0"}, "закладки": [{ "ID": "LEGONINX106W0079264", "создатель": "игрок", "позиция": 96, "CreationDate": { "дата": "2016-12-26T09: 37: 36.916Z"}, "oid_id": { "подъязычная": "5860e4e0ca6baf9032edc0d0"}}, { "ID": "ONEPERCENTMW0128677", "создатель": "игрок" , "позиция": 0,08, "CreationDate": { "дата": "2018-12-18T15: 42: 33.956Z"}, "oid_id": { "OID": "5c191569faf8474953758930"}}], "lastaction": { "дата": "2018-12-18T15: 42: 28.107Z"}, "настройки": { "preferredlanguage": "Ф.", "preferredvideoquality": "HD"}, "идентификатор": "ocs_32a6ad6dd242d5e3842f9211fd236723_1461773211"}

Вот мой код (вдохновленный этим руководством: https://acadgild.com/blog/determining-popular-hashtags-in-twitter-using-pig)

register /path/to/json-simple-1.1.1.jar 
register /path/to/elephant-bird-core-4.17.jar
register /path/to/elephant-bird-pig-4.17.jar
register /path/to/elephant-bird-hadoop-compat-4.17.jar
define JsonLoaderEB com.twitter.elephantbird.pig.load.JsonLoader;

A = LOAD 'file.json' USING JsonLoaderEB('-nestedLoad=true') as myMap;
describe A;

input_table: { myMap: bytearray}

B = foreach A generate flatten(myMap#'bookmarks') as (bookmark:map[]);
describe B;

B: { закладка: карта []}

Когда мы выводим вышеприведенное соотношение, мы видим, что все данные были успешно загружены.

([{ "oid_id": { "подъязычная": "5860e4e0ca6baf9032edc0d0"}, "создатель": "игрок", "CreationDate": { "Дата": "2016-12-26T09: 37: 36.916Z"} , "идентификатор": "LEGONINX106W0079264", "положение": 96}, { "oid_id": { "OID": "5c191569faf8474953758930"}, "создатель": "игрок", "CreationDate": { "дата": "2018 -12-18T15: 42: 33.956Z "}," идентификатор ":" ONEPERCENTMW0128677" , "положение": 0.08}])

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

C = foreach B generate bookmark#'creationdate' as date_fact, bookmark#'creator' as creator, bookmark#'id' as id, bookmark#'position' as position;

C: { date_fact: bytearray, создатель: bytearray, id: bytearray, позиция: bytearray }

Вывод таблицы дает следующую ошибку:

Трассировка стека свиней

ОШИБКА 1066: Невозможно открыть итератор для псевдонима C. Ошибка бэкенда: вершина не удалась, vertexName = scope-41, vertexId = vertex_1542613138136_6721 88_2_00, диагностика = [задача не выполнена, taskId = task_1542613138136_672188_2_00_000000, диагностика = [задача TaskAttempt 0 не выполнена, информация = [ошибка: ошибка во время выполнения задачи (ошибка): попытки_1542613138136_672188_2_00_000000_0: org.apache.pig.backend.executionengine.ExecException: ОШИБКА 0: исключение при выполнении (имя: C: Store (hdfs: // sandbox / tmp / temp-1543074195 / tmp277240455: org.apache.pig.impl.io.InterStorage) - sc ope-40 Ключ оператора: scope-40): org.apache.pig.backend.executionengine.ExecException: ОШИБКА 0: Исключительная ситуация при выполнении [POMapLookUp ( Имя: POMapLookUp [bytearray] - ключ оператора scope-28: scope-28) children: null at [null [4,31]]]: java.lang.ClassCastException: java.lan Строка g.String не может быть приведена к java.util.Map в org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput (PhysicalOperator.java:315) в org.apache.pig.backend.hadoop.executionengine.tez.plan.operator.POStoreTez.getNextTuple (POStoreTez.java:123) в org.apache.pig.backend.hadoop.executionengine.tez.runtime.PigProcessor.runPipeline (PigProcessor.java:376) в org.apache.pig.backend.hadoop.executionengine.tez.runtime.PigProcessor.run (PigProcessor.java:241) в org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run (LogicalIOProcessorRuntimeTask.java:370) в org.apache.tez.runtime.task.TaskRunner2Callable $ 1.run (TaskRunner2Callable.java:73) в org.apache.tez.runtime.task.TaskRunner2Callable $ 1.run (TaskRunner2Callable.java:61) at java.security.AccessController.doPrivileged (собственный метод) в javax.security.auth.Subject.doAs (Subject.java:422) в org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1698) в org.apache.tez.runtime.task.TaskRunner2Callable.callInternal (TaskRunner2Callable.java:61) в org.apache.tez.runtime.task.TaskRunner2Callable.callInternal (TaskRunner2Callable.java:37) на org.apache.tez.common.CallableWithNdc.call (CallableWithNdc.java:36) в java.util.concurrent.FutureTask.run (FutureTask.java:266)в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:624) в java.lang.Thread.run (поток) Вызывается: org.apache.pig.backend.executionengine.ExecException: ОШИБКА 0: Исключительная ситуация при выполнении [POMapLookUp (Имя: POMapLookUp [byt earray] - ключ оператора scope-28: scope-28) children: null at [null [4,31]]]: java.lang.ClassCastException: java.lang.String нельзя сопоставить с java.util.Map в org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.getNext (PhysicalOperator.java: 364) по адресу org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POForEach.processPlan (POForEach.java:406) по адресу org.apache.pig.backend.hadoop.executionengine.physicalLOperach.phgetalOpeupOn(POForEach.java:323) в org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator.processInput (PhysicalOperator.java:305) 1,9Вверх

1 Ответ

0 голосов
/ 08 января 2019

Даже если он дает хороший результат для отношения table_extraction, он может быть из необработанных данных.

Можете ли вы удалить или исправить следующий объект, он выглядит недействительным:

"oid":"5c191393faf8475cb76ee0d5"
...