【问题标题】:Convert xml to json to process file into Bigquery将 xml 转换为 json 以将文件处理为 Bigquery
【发布时间】:2014-11-25 10:50:13
【问题描述】:

我想将 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 yyy.json

使用 xml-json 的其他测试 **David 推荐

通过以下命令使用来自 stackoverflow.com-Users.7z 的此文件 Users.xml(大小 895M):xml-json Users.xml row > Users.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)

【问题讨论】:

  • “它不起作用”不是错误描述。而且您既没有提供输入样本,也没有提供所需输出的规范,也没有展示您尝试过的具体内容。您如何假设除了千里眼之外的任何人都能够帮助您?
  • 没错,我无法处理数据。我使用了stackoverflow.com-Comments.7z(来自archive.org/details/stackexchange)1.8GB。但是当尝试将 xml 文件转换为 json 到 7z 时。这个过程永远不会结束。我使用了具有 13GB RAM 和 2 个处理器的 VM。也许存在其他方式来处理大文件或转换文件以将数据放入 BigQuery。
  • 看。您机器的规格对于这项任务并不重要。获取可以打开大型文本文件的文本编辑器。打开 XML 并剪下一个有代表性的样本。从该示例中,仔细创建您想要查看的 JSON。在这里发布两个代码示例,我(或其他人,就此而言)将能够看到他们能做什么。你不会得到这样的答案:“只需使用工具 XYZ 将 XML 转换为 JSON。”,部分原因是你没有发布任何硬性要求,部分原因是这个神奇的工具甚至可能没有存在。
  • 好的,这是一个文件示例(要转换的 xml),很简单,但是当我可以转换这 5GB 时工具崩溃,实际上我没有错误消息只是崩溃,如果我使用 100mb 文件大小工作,但是.. 我用 xml2json xml2json -t json2xml -o xxx.xml yyy.json *** ...
  • 最好是直接更新你的问题(直接点击“编辑”),cmets 不是贴代码的地方。

标签: xml json google-bigquery stackexchange opendata


【解决方案1】:

David M Smith 的回答是正确的,转换为 CSV 也可以。

经过几次尝试(并修改了我的答案,因为我在回答之前没有彻底测试),我设法用一个像这样的小 Python 脚本创建了一个正确的 json 文件:

#!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)

那么您可能需要重新启动 shell 以更新路径(或任何其他方法)。

对于最大的文件,我之前需要拆分它们,因为 BigQuery 接受最大 4GB 的文件。这是完整的流程:

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 部分不是强制性的,但我更愿意将文件上传到 Cloud Storage 然后导入。这样,如果导入失败,我可以重试。

如果 Google 团队的某个人正在阅读,最好将其作为公共数据集 :-)

请注意,这不适用于任何 XML,仅适用于与当前 Stack Exchange 导出格式类似的格式。

【讨论】:

  • 谢谢大卫!使用此程序可以完美运行。只是我添加了创建 xml-json 流的权限。 chmod -R 777 文件夹
  • 但如果尝试使用 200MB 或 100MB 的 xml 文件。该工具不起作用.xml-json file.xml 行 > file.json(我将 xml 拆分为处理但还没有)
  • 我刚刚测试了 Votes.xml 文件,解压后为 6.5GB。它确实有效,但需要花费大量时间(大约 4 小时)。
  • 是的,但是 4 小时和很多过程......嗯¿选项?使用 Hadoop 集群来处理和减少时间?
  • 如果你想达到那个程度,只需编写具有流功能的临时解析器,它会更快。
【解决方案2】:

你真的需要 JSON 吗?除非您的数据在结构中是分层的,否则 CSV 可能会更快/更容易。

使用 xml2csv-conv 之类的东西将您的数据转换为 CSV,然后使用 bq 命令行工具上传:

bq load mydataset.mytable mydata.csv "column1:string,column2:string ..."

【讨论】:

  • 确定 csv 是否很棒!但文件大小平均为 5 GB (2GB-4GB-6GB) 所以...这个工具支持大文件吗?我不认为,但我现在就尝试..
  • 在上传之前压缩文件会有所帮助。根据 gzip 文件的大小,您可能还需要先上传到 Google 云存储,然后使用 bq 导入您的表格。 cloud.google.com/bigquery/…
  • ...但是当我尝试处理大小为 800MB 的文件时 xml2csv-conv -l row file.xml file.csv 线程“main”中的异常 java.lang.OutOfMemoryError: Java heap space at com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.createChunk edDocumentImpl.java:1932)
猜你喜欢
  • 2017-12-14
  • 2017-06-18
  • 2023-03-09
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多