2014-09-30 78 views
2

我想将一个stackexchange原始数据处理成BigQuery,但首先数据使用7z压缩格式,所以我解压缩数据以将其移植到gz格式,但内部文件是一个XML。所以我需要将文件从xml转换为json。有任何想法吗?我使用p7zip解压缩和xml2json尝试移植xml文件,但无法正常工作。将xml转换为json以将文件处理成Bigquery

<?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 **大卫recomendations

使用这个文件users.xml中(大小895M)从stackoverflow.com-Users.7z使用此命令:XML,JSON users.xml中排> 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) 
+0

转换复杂的FpML XML文本(TSV)

  • 加载数据到BigQuery的
  • 查询数据 “它不工作” 是不是一个错误的描述。你既没有给出你的输入样本,也没有给出你需要的输出的规范,也没有给出你所尝试的结果。你如何认为只有透视才能帮助你? – Tomalak 2014-10-01 06:53:40

  • +0

    的确如此,我无法处理数据。我使用了stackoverflow.com-Comments.7z(来自https://archive.org/details/stackexchange)1.8GB。但是当尝试将xml文件转换为json到7z中。这个过程永无止境。我使用了13GB RAM和2个处理器的虚拟机。也许存在其他方式来处理大文件o将目标文件转换成BigQuery数据。 – 2014-10-01 14:22:42

    +0

    看。您的机器规格对于此任务并不重要。获取可以打开大型文本文件的文本编辑器。打开XML并剪下一个有代表性的样本。从该示例中,仔细创建您想要查看的JSON。在这里发布这两个代码示例,我(或其他人,就此而言)将能够看到他们可以做什么。你不会得到如下答案:*“只需使用工具XYZ将XML转换为JSON即可。”部分原因是你没有发布任何硬性要求,部分原因是这个魔法工具可能不存在。 – Tomalak 2014-10-01 14:37:00

    回答

    2

    大卫·史密斯中号的答案是正确的,转换为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部分是不是强制性的,但我更舒服上传在云存储我的文件,然后导入。这样,如果导入失败,我可以重试。

    如果从谷歌团队某人正在阅读,这将是伟大得到这个作为公共数据集:-)

    注意,这不会对任何工作个XML,仅适用于格式化喜欢的那些当前的堆栈交换输出格式。

    +0

    谢谢大卫!这个程序完美运作。只是我添加了创建xml-json流的权限。 chmod -R 777文件夹 – 2014-10-02 23:25:38

    +0

    但是如果尝试使用200MB或100MB的xml文件。该工具不work.xml-json file.xml行> file.json(我分裂的XML进程,但没有什么) – 2014-10-03 01:48:45

    +0

    我只测试了它的Votes.xml文件,6.5GB一次解压缩。它确实有效,但需要花费大量的时间(大约4小时)。 – David 2014-10-03 06:12:39

    1

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

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

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

    当然如果是csv太棒了!大小文件在平均5 GB(2GB-4GB-6GB),所以...这个工具苏输出大文件?我想不是,但我现在尝试.. – 2014-10-01 15:00:27

    +0

    在上传之前对文件进行Gzip会有所帮助。根据gzip文件大小,您可能还需要先上传到Google云存储,然后使用bq将其导入到您的表格中。 https://cloud.google.com/bigquery/loading-data-into-bigquery#loaddatagcs – 2014-10-02 04:18:03

    +0

    谢谢大卫!,这也适用。 – 2014-10-03 00:30:06