视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何将JSON,Text,XML,CSV数据文件导入MySQL数据库中
2020-11-09 09:06:59 责编:小采
文档


  这是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">12.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中,使用它进行导入:

call import_some_xml('你的XML文件路径', '/some_list/someone');

  程序相当的直白,只要了解一下MySQL的脚本编写即可。

  这里提一下DELIMITER $$。我们知道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),这需要另开一篇讨论了。

  谢谢阅读,欢迎指正。

下载本文
显示全文
专题