如何將 JSON, Text, XML, CSV 資料檔案匯入 MySQL
將外部資料匯入(import)資料庫是在資料庫應用中一個很常見的需求。其實這就是在資料的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是說,將特定結構(structure)或者格式(format)的資料匯入某個目的地(比如資料庫,這裡我們討論MySQL)。
本文要討論的內容,是如何方便地將多種格式(JSON, Text, XML, CSV)的資料匯入MySQL之中。
本文大綱:
- 將Text檔案(包括CSV檔案)匯入MySQL
- 將XML檔案匯入MySQL
- 將JSON檔案匯入MySQL
- 使用MySQL workbench的Table Data Export and Import Wizard進行JSON或CSV檔案的匯入匯出
1. 將Text檔案(包括CSV檔案)匯入MySQL
這裡我們的討論是基於一個假定,Text file和CSV file是有著比較規範的格式的(properly formatted),比如說每行的每個資料域(field)之間是由一個共同的分隔符(比如tab: t)分隔的。
那麼首先,你需要根據你的資料的格式(有哪些域),來設計好資料庫的對應的表 (的Schema)。
舉個例子,要處理的Text檔案或者CSV檔案是以t作為分隔符的,每行有id, name, balance這麼三個資料域,那麼首先我們需要在資料庫中建立這個表:
CREATE TABLE sometable(id INT, name VARCHAR(255), balance DECIMAL(8,4));
建立成功以後就可以匯入了。操作方式很簡單:
LOAD DATA LOCAL INFILE '你的檔案路徑(如~/file.csv)' INTO TABLE sometable FIELDS TERMINATED BY 't' [ENCLOSED BY '"'(可選)] LINES TERMINATED BY 'n' (id, name, balance)
這裡要注意的是,我們需要開啟local-infile這個MySQL的配置引數,才能夠成功匯入。究其原因,從MySQL的Manual中可以看到這麼一段話:
LOCAL works only if your server and your client both have been configured to permit it. For example, if mysqld was started with –local-infile=0, LOCAL does not work. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.
這是MySQL出於安全考慮的預設配置。因此,我們需要在配置檔案my.cnf中(以Debian發行版的Linux, 如Ubuntu為例, 即是在/etc/my.cnf中),確保:
local-infile=1
抑或是在命令列啟動MySQL時加上–local-infile這一項:
mysql --local-infile -uroot -pyourpwd yourdbname
此外,我們也可以使用MySQL的一個官方匯入程式 mysqlimport,這個程式本質上就是為LOAD DATA FILE提供了一個命令列的interface,很容易理解,我們這裡就不再詳述。
2. 將XML檔案匯入MySQL
這件事的完成方式,與我們的XML的形式有著很大的關係。
舉個例子說,當你的XML資料檔案有著很非常規範的格式,比如:
<?xml version="1.0"?> <row> <field name="id">1</field> <field name="name">Free</field> <field name="balance">2333.3333</field> </row> <row> <field name="id">2</field> <field name="name">Niki</field> <field name="balance">1289.2333</field> </row>
或者
<row column1="value1" column2="value2" .../>
我們就可以很方便使用LOAD XML來匯入,這裡可以參見MySQL的官方手冊–LOAD XML Syntax。 然而我們可能有另外一些需求,比如說,我們可能會想要將XML檔案的域對映到不同名字的列(TABLE COLUMN)之中。這裡要注意,MySQL v5.0.7以後,MySQL的Stored Procedure中不能再執行LOAD XML INFILE
或者LOAD DATA INFILE
。所以轉換的程式(procedure)的編寫方式與在此之前有所不同。這裡,我們需要使用Load_File()和ExtractValue()這兩個函式。 以下是一個示例XML檔案和程式:
檔案:
<?xml version="1.0"?> <some_list> <someone id="1" fname="Rob" lname="Gravelle"/> <someone id="2" fname="Al" lname="Bundy"/> <someone id="3" fname="Little" lname="Richard"/> </some_list>
程式:
DELIMITER $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `import_some_xml`(path varchar(255), node varchar(255)) BEGIN declare xml_content text; declare v_row_index int unsigned default 0; declare v_row_count int unsigned; declare v_xpath_row varchar(255); set xml_content = load_file(path); -- calculate the number of row elements. set v_row_count = extractValue(xml_content, concat('count(', node, ')')); -- loop through all the row elements while v_row_index < v_row_count do set v_row_index = v_row_index + 1; set v_xpath_row = concat(node, '[', v_row_index, ']/@*'); insert into applicants values ( extractValue(xml_content, concat(v_xpath_row, '[1]')), extractValue(xml_content, concat(v_xpath_row, '[2]')), extractValue(xml_content, concat(v_xpath_row, '[3]')) ); end while; END
我們知道MySQL的命令分隔符預設為分號,然而指令碼中很顯然是有分號的,但是我們並不希望立即執行,所以我們需要臨時更改分隔符。
3. 將JSON檔案匯入MySQL
如何將JSON檔案匯入MySQL中,是一個很有趣的話題。JSON是一種現在相當常用的檔案結構,所以掌握它的匯入具有比較廣泛的意義。
很多時候,我們處理的JSON資料是以如下形式出現的:
{"name":"Julia","gender":"female"} {"name":"Alice","gender":"female"} {"name":"Bob","gender":"male"} {"name":"Julian","gender":"male"}
而並不是規整的[{},{},{},{}](一些NoSQL資料庫的Export)。
這樣的形勢對於載入有一個好處:因為每一行是一個JSON Object,所以我們便可以按行處理此檔案,而不需要因為JSON的嚴格結構將整個檔案(比如一個許多G的.json檔案)全部載入。
方式一 使用common-schema
common-schema是一個應用很廣泛的MySQL的框架,它有著很豐富的功能和詳細的文件。我們可以使用它的JSON解析的功能。(它還具有JSON轉換成XML等等方便的功能)
具體說來,將common-schema匯入之後,使用它的extract_json_value
函式即可。原始碼中:
create function extract_json_value( json_text text charset utf8, xpath text charset utf8 ) returns text charset utf8
該函式接受兩個引數,一個是json_text,表示json檔案的內容,另一個是xpath,表示資料的結構(這裡可以類比XML檔案的處理)。很多讀者應該知道,XPath是用來對XML中的元素進行定位的,這裡也可以作一樣的理解。
以本段開始的幾行JSON為例,這裡common-schema的使用如下例:
select common_schema.extract_json_value(f.event_data,'/name') as name, common_schema.extract_json_value(f.event_data,'/gender') as gender, sum(f.event_count) as event_count from json_event_fact f group by name, gender;
關於event_data,我們需要先理解LOAD DATA INFILE是一個event,不同的event type對應不同的event data。這部分知識可以參看Event Data for Specific Event Types
如果感興趣,可以參看其原始碼。參看一個受到廣泛使用的專案的原始碼,對於自身成長是很有益的。
當然了,我們也可以像之前處理XML檔案匯入一樣,自己編寫程式。這裡便不再給出例項程式,有興趣的讀者可以自行編寫或者跟筆者交流。
方式二 使用mysqljsonimport
這是Anders Karlsson的一個完成度很高的作品。這一份程式由C寫成。它依賴於一個JSON Parser,Jansson。他們都有著比較好的維護和文件,所以使用上體驗很好。
mysqljsonimport的下載在SourceForge上。具體使用參照其文件即可。
為了方便不熟悉原始碼安裝的朋友,筆者在這裡提一下安裝流程和注意事項。
安裝命令順序如下:
$ wget http://sourceforge.net/projects/mysqljson/files/myjsonimport_1.6/mysqljsonimport-1.6.tar.gz $ tar xvfz mysqljsonimport-1.6.tar.gz $ cd mysqljsonimport-1.6 $ ./configure –-with-mysql=/xxx/mysql $ make $ make check $ sudo make install
--with-mysql
這一步不是必要的,只要你安裝的mysql的路徑是系統的預設路徑。很關鍵的,而且很容易被不熟悉的朋友忽略的是,這一個C程式要成功編譯和執行,是需要MySQL的C API的,所以需要安裝的依賴,除了jansson,還有libmysqlclient-dev。
jansson的安裝就是簡單的原始碼安裝,libmysqlclient-dev則可以使用包管理工具(比如ubuntu中使用apt-get即可;編譯和安裝前,建議先sudo apt-get update
以避免不必要的麻煩)。
匯入命令:
$ ./mysqljsonimport –-database test –-table tablename jsonfilename
還有一個parser,作者是Kazuho,感興趣的讀者可以參看一下,他的相關博文是mysql_json – a MySQL UDF for parsing JSON ,github專案是mysql_json。
4. 使用MySQL workbench
Workbench這個工具對於許多不熟悉SQL語言或者命令列的朋友還是很方便和友好的。利用它,可以方便地匯入和匯出CSV和JSON檔案。
具體操作圖例參見MySQL官方手冊即可:Table Data Export and Import Wizard,這裡不再贅述。
總結
本文介紹了將不同格式(JSON, Text, XML, CSV)的檔案匯入MySQL資料庫的一些詳細手段,並進行了一些分析,目的在於幫助讀者掃除一些匯入的障礙,理清一些概念。之所以沒有討論匯出,是因為匯出是一個MySQL到外的操作,是以MySQL本身為轉移的,只要參考MySQL本身的機理即可。
真正對於大量資料的匯入匯出,需要思考的問題會很多(比如說在匯入時,如何考慮Sharding,這需要另開一篇討論了。
謝謝閱讀,歡迎指正。
相關文章
- Mysql匯入csv檔案MySql
- mysql匯入csv格式檔案MySql
- mysql匯入匯出.csv格式資料MySql
- waterdrop匯出hdfs資料到clickhouse(text,csv,json)JSON
- 如何把 .csv 的檔案匯入資料庫SQL SERVER 中!資料庫SQLServer
- MYSQL資料檔案匯入MySql
- 將XML匯入資料庫XML資料庫
- python - csv : 將text轉為csv檔案 (txt2csv)Python
- Solr json,xml等檔案資料匯入(新增索引)linux下操作SolrJSONXML索引Linux
- SQLServer匯入大CSV檔案SQLServer
- 使用xml檔案,做資料的匯入,匯出 (轉)XML
- 把csv檔案的資料匯入到oracle資料庫中Oracle資料庫
- 將csv檔案匯入到neo4j中
- PHP 匯出大資料 CSV 檔案PHP大資料
- 如何透過Python將JSON格式檔案匯入redis?PythonJSONRedis
- 如何將資料熱匯出到檔案
- MySQL 5.5使用CSV儲存引擎匯入載入資料MySql儲存引擎
- PHP匯入大量CSV資料PHP
- MySQL匯入匯出檔案檔案MySql
- 教你如何將二進位制檔案匯入到資料庫資料庫
- 一次將資料匯出為 CSV 格式檔案時遇到的坑
- office for Mac Excel匯入csv檔案亂碼MacExcel
- tsdump-用於匯出資料庫表結構的工具(支援匯出為text、markdown、csv、json)資料庫JSON
- PHP匯出大量資料,儲存為CSV檔案PHP
- java匯出CSV檔案Java
- js 匯入json配置檔案JSON
- 【node】如何在ES modules中匯入JSON檔案JSON
- MySQL匯出資料為csv的方法MySql
- Mysql資料庫使用Navicat Mysql匯入sql檔案報錯MySql資料庫
- 資料匯入終章:如何將HBase的資料匯入HDFS?
- mysql 匯入匯出 sql檔案MySql
- MySQL匯入匯出平面檔案MySql
- Mysql匯入本地檔案MySql
- 如何使用python把json檔案轉換為csv檔案PythonJSON
- linux 下MySQL命令列匯出csv檔案格式LinuxMySql命令列
- PHP 匯出 CSV 格式檔案PHP
- oralce 匯出csv格式檔案
- MySQL 匯出資料為csv格式的方法MySql