Преобразование XML в JSON для обработки файлов в BigQuery
Я хотел бы обработать необработанные данные 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 "rushed" 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)





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

01.10.2014 08:59:04
Вам действительно нужен JSON? Если ваши данные не являются иерархическими в структуре CSV может быть быстрее / проще.
Используйте что-то вроде xml2csv-conv для преобразования данных в CSV, а затем загрузите их с помощью инструмента командной строки bq:
bq load mydataset.mytable mydata.csv "column1:string,column2:string ..."




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.










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

07.08.2017 09:42:40
Самый простой способ добиться этого-использовать инструмент конвертера, который поддерживает 7z и BigQuery.
Я написал сообщение в блоге, которое показывает пошаговые инструкции о том, как вы можете конвертировать XML-файлы в BigQuery .
- Преобразование сложных FpML XML в текст (TSV)
- Загрузка данных в BigQuery
- Запрос данных в BigQuery