456lives.com - 舒适慢生活

专享优惠券-淘宝天猫最热门优惠券清单 阿里旅行-前往世界的尽头 【聚名品】奢品潮流风向标 省钱优惠圈 精品女装 靓丽全场
文字广告45元/月 聚划算专享优惠 文字广告45元/月 文字广告45元/月 文字广告45元/月
京东居家生活 日用精品 抽免单+抽红包,福利抽不停 天猫超市-今日疯抢 多款好货任你抢 全球精选-享品质生活 广告合作客服QQ:253482037

将JSON Text XML CSV数据文件导入MySQL的常用方法

时间:2017-07-07 08:48:13 | 作者:本站编辑 | 来源:网络 | 查看:261 | 评论:0

摘要: 将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入...

        将外部数据导入(import)数据库是在数据库应用中一个很常见的需求。其实这就是在数据的管理和操作中的ETL (Extract, transform, load)的L (Load)部分,也就是说,将特定结构(structure)或者格式(format)的数据导入某个目的地(比如数据库,这里我们讨论MySQL)。今天慢生活的工程师就教大家如何方便地将多种格式(JSON,Text,XML,CSV)的数据导入MySQL之中。

        本文大纲:

        1.将Text文件(包括CSV文件)导入MySQL

        2.将XML文件导入MySQL

        3.将JSON文件导入MySQL

        4.使用MySQL workbench的Table Data Export and Import Wizard进行JSON或CSV文件的导入导出

将数据文件导入MySQL的常用方法

        一、将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,很容易理解,我们这里就不再详述。

        二、将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>

        我们就可以很方便使用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的命令分隔符默认为分号,然而脚本中很显然是有分号的,但是我们并不希望立即执行,所以我们需要临时更改分隔符。

        三、将JSON文件导入MySQL

        如何将JSON文件导入MySQL中,是一个很有趣的话题。JSON是一种现在相当常用的文件结构,所以掌握它的导入具有比较广泛的意义。很多时候,我们处理的JSON数据是以如下形式出现的:(而并不是规整的[{},{},{},{}](一些NoSQL数据库的Export)。)

{"name":"Julia","gender":"female"}
{"name":"Alice","gender":"female"}
{"name":"Bob","gender":"male"}
{"name":"Julian","gender":"male"}

        这样的形势对于载入有一个好处:因为每一行是一个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

        四、使用MySQL workbench

        Workbench这个工具对于许多不熟悉SQL语言或者命令行的朋友还是很方便和友好的。利用它,可以方便地导入和导出CSV和JSON文件。具体操作图例参见MySQL官方手册即可:Table Data Export and Import Wizard,这里不再赘述。

MySQL workbench

        总结

        本文介绍了将不同格式(JSON, Text, XML, CSV)的文件导入MySQL数据库的一些详细手段,并进行了一些分析,目的在于帮助读者扫除一些导入的障碍,理清一些概念。之所以没有讨论导出,是因为导出是一个MySQL到外的操作,是以MySQL本身为转移的,只要参考MySQL本身的机理即可。

  • 0
    惊讶
  • 0
    欠揍
  • 0
    支持
  • 0
    很棒
  • 0
    愤怒
  • 0
    搞笑
  • 0
    恶心
  • 0
    不解
此篇文章已有0人参与评论

请发表评论

热门评论

精选资讯


免责申明:本站部份内容来源自互联网,如果侵害了您的合法权益,请您及时与我们联系,我们会在第一时间给予改正和删除。

Powered by 舒适慢生活 Copyright © 2013-2023, All Rights Reserved京ICP备13024987号-4京公网安备11010602030047号京公网安备11010602030047号

工作时间:7x24小时联系QQ:253482037服务热线:188****4459活动洽谈:188****4459联系邮箱:253482037@qq.com