10.2 数据存储
可以在元素标签 < datastore-catalog > 下的配置文件中配置数据存储。下面几节将详细介绍特定类型的数据存储。
数据库(JDBC)连接
下面是一些常见数据库类型的示例。
提示! DataCleaner用户界面使得计算连接属性的url(连接字符串)和驱动程序类部分变得更加容易。如果你还不知道这些属性的话,这是一个很好的开始。 |
MySQL
<jdbc-datastore name="MySQL datastore">
<url>jdbc:mysql://hostname:3306/database?defaultFetchSize=-2147483648</url>
<driver>com.mysql.jdbc.Driver</driver>
<username>username</username>
<password>password</password>
<multiple-connections>true</multiple-connections>
</jdbc-datastore>
Oracle
<jdbc-datastore name="Oracle datastore">
<url>jdbc:oracle:thin:@hostname:1521:sid</url>
<driver>oracle.jdbc.OracleDriver</driver>
<username>username</username>
<password>password</password>
<multiple-connections>true</multiple-connections>
</jdbc-datastore>
Microsoft SQL Server
与Microsoft SQL server的典型连接如下所示:
<jdbc-datastore name="MS SQL Server datastore">
<url>jdbc:jtds:sqlserver://hostname/database;useUnicode=true;characterEncoding=UTF-8</url>
<driver>net.sourceforge.jtds.jdbc.Driver</driver>
<username>username</username>
<password>password</password>
<multiple-connections>true</multiple-connections>
</jdbc-datastore>
但是,如果要使用基于实例名称的连接,则必须运行SQL Server Browser服务,然后可以包含实例参数:下面是连接到SQLEXPRESS实例的示例:
<url>jdbc:jtds:sqlserver://hostname/database;instance=SQLEXPRESS;useUnicode=true;characterEncoding=UTF-8</url>
逗号分隔值(CSV)文件
这是一个CSV文件数据存储的例子
<csv-datastore name="my_csv_file">
<filename>/path/to/file.csv</filename>
<quote-char>"</quote-char>
<separator-char>;</separator-char>
<encoding>UTF-8</encoding>
<fail-on-inconsistencies>true</fail-on-inconsistencies>
<header-line-number>1</header-line-number>
</csv-datastore>
固定宽度值文件
具有固定宽度值的文件可以通过两种方式进行注册—要么对所有列使用单个固定宽度大小,要么使用单个值宽度。
下面是一个为所有列指定固定宽度的示例:
<fixed-width-datastore name="FIXED-WIDTH-ALL-COLUMNS">
<filename>/path/to/the/file.txt</filename>
<width-specification>
<fixed-value-width>20</fixed-value-width>
</width-specification>
<encoding>UTF-8</encoding>
<header-line-number>1</header-line-number>
<fail-on-inconsistencies>true</fail-on-inconsistencies>
<skip-ebcdic-header>false</skip-ebcdic-header>
<eol-present>true</eol-present>
</fixed-width-datastore>
下面是一个单独(2列)宽度规格的示例:
<fixed-width-datastore name="FIXED-WIDTH-2-COLUMNS">
<filename>/path/to/the/file.txt</filename>
<width-specification>
<value-width>20</value-width>
<value-width>30</value-width>
</width-specification>
<encoding>UTF-8</encoding>
<header-line-number>1</header-line-number>
<fail-on-inconsistencies>true</fail-on-inconsistencies>
<skip-ebcdic-header>false</skip-ebcdic-header>
<eol-present>true</eol-present>
</fixed-width-datastore>
下面是一个EBCDIC文件的示例:
<fixed-width-datastore name="FIXED-WIDTH-EBCDIC">
<filename>/path/to/the/file.ebc</filename>
<width-specification>
<value-width>2</value-width>
<value-width>10</value-width>
</width-specification>
<encoding>IBM01148</encoding>
<header-line-number>0</header-line-number>
<fail-on-inconsistencies>true</fail-on-inconsistencies>
<skip-ebcdic-header>true</skip-ebcdic-header>
<eol-present>false</eol-present>
</fixed-width-datastore>
Excel表格 数据存储
这是一个Excel表格数据存储的示例:
<excel-datastore name="my_excel_spreadsheet">
<filename>/path/to/file.xls</filename>
</excel-datastore>
XML文件数据存储
定义XML数据存储既可以用简单的(自动映射的)方法,也可以用高级的(性能和内存效率更高的)方法。
简单的方法就是用文件名定义xml数据存储,如下所示:
<xml-datastore name="my_xml_datastore">
<filename>/path/to/file.xml</filename>
</xml-datastore>
当文件大小较小且层次结构不太复杂时,这种XML数据存储就可以工作。它的缺点是,它试图自动检测一个适合表示XML内容的表结构(这是一个树结构,而不是真正的表)。
为了解决这个问题,还可以定义自己的表结构,在其中指定构成行的XPath和行中的值。举个例子:
<xml-datastore name="my_xml_datastore">
<filename>/path/to/file.xml</filename>
<table-def>
<rowXpath>/greetings/greeting</rowXpath>
<valueXpath>/greetings/greeting/how</valueXpath>
<valueXpath>/greetings/greeting/what</valueXpath>
</table-def>
</xml-datastore>
数据存储定义了一个表,其中每个记录都定义为与 XPath “/greetings/greeting” 匹配的元素。该表有两列,由“how”和“what”元素表示,它们是行路径的子元素。
有关定义XML数据存储的表模型的XPath表达式的更多详细信息,请参阅MetaModel的教程(MetaModel是用于在DataCleaner中读取数据的数据访问库)。
ElasticSearch 数据存储
这是ElasticSearch索引数据存储的示例:
<elasticsearch-datastore name="my_elastic_search_index">
<hostname>localhost</hostname>
<port>9300</port>
<cluster-name>my_es_cluster</cluster-name>
<index-name>my_index</index-name>
</elasticsearch-datastore>
MongoDB 数据存储
这是一个完全指定的MongoDB数据存储的示例,示例表结构基于两个集合。
<mongodb-datastore name="my_mongodb_datastore">
<hostname>localhost</hostname>
<port>27017</port>
<database-name>my_database</database-name>
<username>user</username>
<password>pass</password>
<table-def>
<collection>company_collection</collection>
<property>
<name>company_name</name>
<type>VARCHAR</type>
</property>
<property>
<name>customer</name>
<type>BOOLEAN</type>
</property>
<property>
<name>num_employees</name>
<type>INTEGER</type>
</property>
<property>
<name>address_details</name>
<type>MAP</type>
</property>
</table-def>
<table-def>
<collection>person_collection</collection>
<property>
<name>person_name</name>
<type>VARCHAR</type>
</property>
<property>
<name>birthdate</name>
<type>DATE</type>
</property>
<property>
<name>emails</name>
<type>LIST</type>
</property>
</table-def>
</mongodb-datastore>
如果省略了主机名和端口元素,本地主机:27017假设的端口。
如果省略用户名和密码元素,将建立匿名连接。
如果没有 table-def 标签元素,将检查数据库,并根据每个集合的前1000个文档自动检测表定义。
CouchDB 数据存储
这是一个完全指定的CouchDB数据存储的示例,示例表结构基于两个CouchDB数据库。
<couchdb-datastore name="my_couchdb_datastore">
<hostname>localhost</hostname>
<port>5984</port>
<username>user</username>
<password>pass</password>
<ssl>true</ssl>
<table-def>
<database>company_collection</database>
<field>
<name>company_name</name>
<type>VARCHAR</type>
</field>
<field>
<name>customer</name>
<type>BOOLEAN</type>
</field>
<field>
<name>num_employees</name>
<type>INTEGER</type>
</field>
<field>
<name>address_details</name>
<type>MAP</type>
</field>
</table-def>
<table-def>
<database>person_collection</database>
<field>
<name>person_name</name>
<type>VARCHAR</type>
</field>
<field>
<name>birthdate</name>
<type>DATE</type>
</field>
<field>
<name>emails</name>
<type>LIST</type>
</field>
</table-def>
</couchdb-datastore>
如果省略了主机名和端口元素,本地主机:5984假设的端口。
如果省略用户名和密码元素,将建立匿名连接。
如果 “ssl” 标签元素为false或遗漏,则将使用常规HTTP连接。
如果没有 table-def 标签元素,则将检查数据库,并根据每个数据库的前1000个文档自动检测表定义。
Composite datastore(复合数据存储)
这是一个复合数据存储的示例。它包含来自另外两个数据存储的数据:数据存储1和数据存储2。
<composite-datastore name="my composite">
<datastore-name>Datastore 1</datastore-name>
<datastore-name>Datastore 2</datastore-name>
</composite-datastore>