Преобразование XML в JSON для обработки файлов в BigQuery

Преобразование XML в JSON для обработки файлов в BigQuery

30.09.2014 09:57:05 Просмотров 92 Источник

Я хотел бы обработать необработанные данные stackexchange в BigQuery, но сначала данные используют формат сжатия 7z, поэтому я распаковал данные, чтобы перенести их в формат gz, но внутренний файл-это xml. Поэтому мне нужно преобразовать файл из XML в JSON. Есть идеи? Я использовал p7zip для распаковки и xml2json, чтобы попытаться перенести xml-файл, но не работать.

<?xml version="1.0" encoding="utf-8"?> <comments> <row Id="1" PostId="1" Score="3" Text="We need to all post more questions. Last time, we kinda &quot;rushed&quot; to get a w hole bunch of people to sign up at the last minute (and pulled some funny stuff" CreationDate="2014-02-12T01:01:14.257" UserId="52" />..

Я использовал xml2json xml2json-t json2xml-o xxx.xml да.формат JSON

Другие тесты с использованием xml-json * * рекомендации Дэвида

Использовали этот файл пользователи.xml (размер 895M)от stackoverflow. com-Users. 7z с этой командой: xml-JSON Users.строка xml > пользователи.формат JSON

xml-json Users.xml row > Users.json /usr/local/lib/node_modules/xml-json/node_modules/xml-nodes/index.js:19 this.soFar += String(chunk)
RangeError: Invalid string length
at XmlNodes._transform (/usr/local/lib/node_modules/xml-json/node_modules/xml-nodes/index.js:19:15)
at XmlNodes.Transform._read (_stream_transform.js:183:22)
at XmlNodes.Transform._write (_stream_transform.js:167:12)
at doWrite (_stream_writable.js:265:12)
at writeOrBuffer (_stream_writable.js:252:5)
at XmlNodes.Writable.write (_stream_writable.js:197:11)
at Duplexify._write (/usr/local/lib/node_modules/xml-json/node_modules/pumpify/node_modules/duplexify/index.js:197:22)
at doWrite (/usr/local/lib/node_modules/xml-json/node_modules/pumpify/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:237:10)
at writeOrBuffer (/usr/local/lib/node_modules/xml-json/node_modules/pumpify/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:227:5)
at Writable.write (/usr/local/lib/node_modules/xml-json/node_modules/pumpify/node_modules/duplexify/node_modules/readable-stream/lib/_stream_writable.js:194:11)
at ReadStream.ondata (_stream_readable.js:539:20)
at ReadStream.emit (events.js:107:17)
at readableAddChunk (_stream_readable.js:162:16)
at ReadStream.Readable.push (_stream_readable.js:125:10)
at onread (fs.js:1581:12)
at Object.wrapper [as oncomplete] (fs.js:482:17)
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery#comment40965361_26127099
"Это не работает" - это не описание ошибки. И вы не дали образец вашего ввода, ни спецификации вывода, который вам нужен, ни не показали, что именно вы пробовали. Как вы думаете, кто-нибудь, кроме ясновидящего, сможет вам помочь?
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery#comment40979972_26127099
Конечно, это правда, я не могу обрабатывать данные. Я использовал stackoverflow. com-Comments. 7z (от archive.org/details/stackexchange ) 1,8 ГБ. но когда вы пытаетесь преобразовать xml-файл в json в 7z. процесс никогда не заканчивается. Я использовал виртуальную машину с 13 ГБ оперативной памяти и 2 процессорами. Может быть, существует другой способ обработки больших файлов o конвертировать файлы с целью положить в BigQuery данные.
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery#comment40980514_26127099
Смотри. Спецификации вашей машины не имеют значения для этой задачи. Получите текстовый редактор, который может открывать большие текстовые файлы. Откройте XML-файл и вырежьте репрезентативный образец. Из этого примера тщательно создайте JSON, который вы хотите увидеть. Разместите оба примера кода здесь, и я (или кто-то другой, если на то пошло) смогу увидеть, что они могут сделать. Вы не получите такой ответ: "просто используйте инструмент XYZ для преобразования XML в JSON.", отчасти потому, что вы не выставляли никаких жестких требований вообще, а отчасти потому, что этот волшебный инструмент, возможно, даже не существует.
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery#comment40981866_26127099
Хорошо, это пример файла (xml для преобразования), прост, но когда я могу конвертировать этот 5GB инструмент аварии, на самом деле у меня нет сообщения об ошибке просто сбой, если я использую 100Mb размер файла работает, но.. Я использовал xml2json xml2json-t json2xml-o xxx.xml да.в JSON ***<?формат XML версия="1.0" кодирование="UTF-8"?> <comments> В прошлый раз мы вроде как" бросились", чтобы получить кучу людей, чтобы зарегистрироваться в последнюю минуту (и вытащил некоторые забавные вещи" CreationDate="2014-02-12T01:01:14.257" UserId= "52"/>...
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery#comment40982040_26127099
Лучше всего, если обновить свой вопрос напрямую (просто нажмите кнопку "Изменить"), комментарии не место для размещения кода.

Ответы - Преобразование XML в JSON для обработки файлов в BigQuery / Convert xml to json to process file into Bigquery

David M Smith

01.10.2014 08:59:04

Вам действительно нужен JSON? Если ваши данные не являются иерархическими в структуре CSV может быть быстрее / проще.

Используйте что-то вроде xml2csv-conv для преобразования данных в CSV, а затем загрузите их с помощью инструмента командной строки bq:

bq load mydataset.mytable mydata.csv "column1:string,column2:string ..."
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26134403#comment40981377_26134403
Конечно, если это так здорово!, но файлы размера находятся в среднем 5 ГБ (2 ГБ-4 ГБ-6 ГБ) так...этот инструмент поддерживает большие файлы? Я думаю, что нет, но я стараюсь прямо сейчас..
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26134403#comment41000198_26134403
Сжатие файла перед загрузкой поможет. В зависимости от размера файла gzip вам также может потребоваться сначала загрузить в облачное хранилище Google, а затем использовать bq для импорта в вашу таблицу. cloud.google.com/bigquery/…
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26134403#comment41032572_26134403
...но когда я пытаюсь обработать файл размером 800 МБ xml2csv-conv-l row file.XML-файл.исключение CSV в потоке "основной" Java для.яз..Исключение OutOfMemoryError: Java для кучи пространства на ком.солнце.орг."Апач".xerces.внутренние.дом.DeferredDocumentImpl.createChunk edDocumentImpl.Ява: 1932)
Является ответом!
David

02.10.2014 09:37:50

Ответ Дэвида М. Смита правильный, преобразование в CSV также будет работать.

После нескольких попыток (и редактирования моего ответа, поскольку я не тестировал тщательно перед ответом) мне удалось создать правильный файл json с небольшим скриптом Python, таким как этот :

#!python
from __future__ import print_function
import sys
import fileinput
import xml
from xml.dom import minidom
import json

for line in fileinput.input():
        try:
                xmlDoc = minidom.parseString(line)
                print(json.dumps(dict(xmlDoc.childNodes[0].attributes.items())))
        except xml.parsers.expat.ExpatError:
                print("Unable to process line : ", line, file=sys.stderr)
        except KeyboardInterrupt:
                sys.exit(0)

Затем вам, вероятно, потребуется перезапустить оболочку, чтобы обновить путь (или любой другой метод).

Для самых больших файлов мне нужно было разделить их раньше, потому что BigQuery принимает файлы максимум 4 ГБ. Вот полный поток :

7z x -so ../orig/stackoverflow.com-Posts.7z 2> /dev/null | ./xmltojson.py > PostHistory3.json
split -e -d -C3G --additional-suffix=.json Posts.json Postssplit
ls Postssplit*.json | xargs -ifile gzip file 
gsutil cp Postssplit*.json.gz gs://YOURBUCKET
bq --project_id=YOURPROJECT load --source_format=NEWLINE_DELIMITED_JSON YOURDATASET.YOURTABLE gs://YOURBUCKET/Postssplit01.json,gs://YOURBUCKET/Postssplit03.json,gs://YOURBUCKET/Postssplit04.json,#ETCETERA 'Id:INTEGER,PostTypeId:INTEGER,AcceptedAnswerId:INTEGER,ParentId:INTEGER,CreationDate:TIMESTAMP,Score:INTEGER,ViewCount:INTEGER,Body:STRING,OwnerUserId:INTEGER,OwnerDisplayName:STRING,LastEditorUserId:INTEGER,LastEditorDisplayName:STRING,LastEditDate:TIMESTAMP,LastActivityDate:TIMESTAMP,Title:STRING,Tags:STRING,AnswerCount:INTEGER,CommentCount:INTEGER,FavoriteCount:INTEGER,ClosedDate:TIMESTAMP,CommunityOwnedDate:TIMESTAMP'

Часть gsutilне является обязательной, но мне удобнее загружать мои файлы в облачное хранилище, а затем импортировать. Таким образом, если импорт не удается, я могу повторить попытку.

Если кто-то из команды Google читает, было бы здорово получить это как общедоступный набор данных :-)

Обратите внимание, что это не будет работать для любых XMLs, только для тех, которые отформатированы как текущие форматы экспорта Stack Exchange.

https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41031602_26154987
Спасибо, Дэвид! с этой процедурой все работало отлично. Просто я добавил разрешения для создания потока xml-json. папка chmod-R 777
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41033429_26154987
но если попытаться использовать xml-файлы, которые 200MB или 100MB. инструмент не работает.файл XML-формата JSON.XML-файл строк>.json (я разделил xml для обработки, но пока ничего)
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41036890_26154987
Я только что проверил его на голоса.XML-файл, 6,5 Гб после распаковки. Это действительно работает, но это занимает возмутительное количество времени (около 4 часов).
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41049799_26154987
Да, но 4 часа и много процесса...параметры МММ ¿? Использовать кластер Hadoop для обработки и сокращения времени?
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41049835_26154987
Если вы хотите пойти до такой степени, просто Закодируйте свой специальный парсер с потоковыми возможностями, это будет быстрее.
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41053115_26154987
Дэвид, я пытаюсь с пользователем.xml из stackoverflow. com-Users. 7z но не работает..для других ситуаций, но инструмент не распараллелил процесс, и время много для обработки файлов. возможно, если мы используем другой инструмент, мы можем обрабатывать больше мощности процессора.. это идея..большое спасибо за ваше сотрудничество.
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41056167_26154987
Я не пробовал это сам, но вот еще одна идея: загрузите свой JSON как файл CSV с одним столбцом, где каждая строка является объектом JSON (например, ' {"a": 1, "b": [4, 5]}'.) Затем используйте функции JSON_EXTRACT () BQ, чтобы извлечь нужные значения в другую таблицу. Это должно работать до тех пор, пока каждый объект (строка) составляет 1 Мб или меньше. Другими словами, Пусть BQ сделает тяжелую работу ETL для вас ;-) cloud.google.com/bigquery/query-reference#jsonfunctions
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41176967_26154987
@NickBortolotti у меня также были проблемы с большими файлами, поэтому я обновил решение для использования пользовательского скрипта Python.
https://stackoverflow.com/questions/26127099/convert-xml-to-json-to-process-file-into-bigquery/26154987#comment41210595_26154987
Хорошо, Дэвид.. да, я думаю, что это лучший вариант..Спасибо!
Graham Polley

29.11.2016 01:21:43

Это старый вопрос, который я знаю, но все изменилось с тех пор, как он был опубликован. Проще, чем возиться с преобразованием ваших данных, было бы написать простой конвейер потока данных (который может читать XML напрямую) и записать его в BigQuery.

  1. https://cloud.google.com/dataflow/
  2. https://cloud.google.com/dataflow/model/bigquery-io
  3. https://cloud.google.com/dataflow/java-sdk/JavaDoc/com/google/cloud/dataflow/sdk/io/XmlSource
Uli Bethke

07.08.2017 09:42:40

Самый простой способ добиться этого-использовать инструмент конвертера, который поддерживает 7z и BigQuery.

Я написал сообщение в блоге, которое показывает пошаговые инструкции о том, как вы можете конвертировать XML-файлы в BigQuery .

  • Преобразование сложных FpML XML в текст (TSV)
  • Загрузка данных в BigQuery
  • Запрос данных в BigQuery
Закрыть X