Я пытаюсь разобрать довольно простой файл 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Вверх