2014-09-30 49 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