Разбор комплексного вложенного JSON в Pig
Я хочу проанализировать набор данных JSON Billionaires в Pig. Файл JSON можно найти здесь.
Вот что имеет каждая запись:
{
"wealth": {
"worth in billions": 1.2,
"how": {
"category": "Resource Related",
"from emerging": true,
"industry": "Mining and metals",
"was political": false,
"inherited": true,
"was founder": true
},
"type": "privatized and resources"
},
"company": {
"sector": "aluminum",
"founded": 1993,
"type": "privatization",
"name": "Guangdong Dongyangguang Aluminum",
"relationship": "owner"
},
"rank": 1372,
"location": {
"gdp": 0.0,
"region": "East Asia",
"citizenship": "China",
"country code": "CHN"
},
"year": 2014,
"demographics": {
"gender": "male",
"age": 50
},
"name": "Zhang Zhongneng"
}
Попытка 1
Я попытался загрузить эти данные, используя следующую команду в grunt:
billionaires = ЗАГРУЗИТЬ), тип:chararray), компания: (сектор: chararray, основатель: int, тип: chararray, имя: chararray, отношение:chararray), ранг: int, местоположение:(gdp:double, регион: chararray, гражданство: chararray, код страны:chararray), год: int, демография: (пол: chararray, возраст:int), имя:chararray');
Это однако дает мне ошибку:
ОШИБКА org.apache.pig.tools.grunt.Grunt - ОШИБКА 1200: несоответствующий ввод 'in' ожидает RIGHT_PAREN
Попытка 2
Затем я попытался использовать загрузчик проекта elephantbird из Twitter под названием com.twitter.elephantbird.pig.load.JsonLoader
, Вот код для этого UDF. Вот что я сделал:
billionaires = LOAD 'billionaires.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]);
names = foreach billionaires generate json#'name' AS name;
dump names;
Теперь это работает, и я не получаю ошибок! Но ничего не отображается. Я получаю вывод как:
Входные данные: успешно прочитано 0 записей (1445335 байт) из: "hdfs://localhost:9000/user/purak/billionaires.json"
Выходные данные: Успешно сохранено 0 записей в: "hdfs://localhost:9000/tmp/temp-1399280624/tmp-477607570"
Счетчики: Общее количество записанных записей: 0 Всего записанных байт: 0 Количество разлитых данных Spillable Memory Manager: 0 Всего предварительно разлитых сумок: 0 Всего записей предварительно разлитых: 0
Работа DAG: job_1478889184960_0005
Что я здесь не так делаю?
1 ответ
Вероятно, это не лучший способ сделать это, но это то, что я в итоге делаю:
Удалите пробелы из имен полей: в наборе данных json я заменил такие поля, как "стоимость в миллиардах", "из появляющихся" и т. Д., На "ценность_ин_биллионов", "от_емеризации" и т. Д. (Я сделал простое "найти и заменить" для этого)
Json с разделителями-запятыми и с разделителями строк: json-файл, который у меня был, имел вид
[{"_comment":"first entry" ...},{"_comment":"second entry" ...}]
, Но JsonLoader в Pig считает каждую новую строку новой записью. Чтобы сделать разделение строк в файле json разделителем вместо запятой, я использовал js, который является процессором командной строки JSON. Установите его, используяsudo apt-get install js
и бегиcat billionaires.json | jq -c ".[]" > newBillionaires.json
,Файл newBillionaires.json теперь содержит каждую запись в новой строке. Теперь загрузите этот файл в Pig, используя:
copyFromLocal /home/purak/Desktop/newBillionaires.json /user/purak
billionaires = LOAD 'newBillionaires.json' ИСПОЛЬЗОВАНИЕ JsonLoader('имя: chararray, демография: (возраст: int, пол:chararray), год: int, местоположение:(country_code:chararray, гражданство: chararray, регион:chararray,gdp:double), ранг: int, компания: (отношение: chararray, имя: chararray, тип: chararray, тип: int, сектор:chararray), состояние: (тип: chararray, как:(was_founder:chararray, наследуется:chararray,was_political:chararray, отрасль:chararray, from_emerging:chararray, категория:chararray),worth_in_biilions:double)');
Примечание. Использование js изменило порядок полей в каждой записи. Следовательно, в команде загрузки все поля расположены в обратном порядке по сравнению с командой загрузки в вопросе.
- Теперь вы можете удалить каждый кортеж, используя:
billionairesFinal = foreach миллиардеры генерируют имя, demographics.age как возраст, demographics.gender как пол, год, location.country_code как countryCode, location.citizenship как гражданство, location.region как регион, location.gdp как gdp, rank, company.relationship как companyRelationship, company.name как companyName, company.type как companyType, company.founded как companyFounded, company.sector как companySector, wealth.type как wealthType, wealth.how.was_founder как wasFounder, wealth.how. наследуется как наследуется, богатство.how.was_political as wasPolitical, wealth.how.industry как отрасль, wealth.how.from_emerging как fromEmerging, wealth.how.category как категория, wealth.worth_in_biilions как worthInBillions;
- Проверьте структуру один раз, используя
describe billionairesFinal;
:
billionairesFinal: {имя: chararray, возраст: int, пол: chararray, год: int,countryCode: chararray, гражданство: chararray, регион: chararray,gdp: double,rank: int,companyRelationhip: chararray,companyName: chararray,companyType: chararray,companyFounded: int,companySector: chararray,wealthType: chararray,wasFounder: chararray, унаследованный: chararray,wasPolitical: chararray, отрасль: chararray,fromEmerging: chararray, категория: chararray,worthInBillions: double}
Это была предполагаемая структура данных, которую я хотел в Pig! Теперь я могу продолжить и проанализировать набор данных:)