MetaModel:跨多种数据存储提供统一的数据访问

最近,Human Inference和Apache软件基金会(ASF)分别宣布了捐赠与接受MetaModel项目的消息, 今后MetaModel将成为一个Apache孵化器项目。此前,MetaModel遵循LGPL许可证,由Human Inference的 产品开发团队管理,但现在已经转移到了ASF上,将遵循新的许可证、拥有新的社区、接受新的管理。那 么这个项目到底是什么呢?它又有哪些用途?

MetaModel是一个Java类库,设计它的目的是提供 一个可以与任何数据存储(不论是关系型数据库、NoSQL数据库,还是电子表格或者其他格式的文件)进 行交互的单一接口。我们的意思是,通过交互来搜索元数据,查询、写入或更改数据存储中保存的数据 。很显然,高层次抽象会丢失一些细节,会带来过度概括和丢失重要特性的风险。我们不想把关系型SQL 数据库的功能减化到只有像(SELECT * FROM [table])这样的全表扫描。但另一方面,我们也不想暴露 一些只能在特定品牌特定版本的SQL服务器上才能使用的功能,因为这些功能无法在任何其他数据存储上 使用。最终,我们想基于现有的常规技能(比如标准SQL)建立数据交互方式。

元数据处理

那么,MetaModel项目为数据存储的方法做了怎样的抽象?该项目通过Java接口发布了一个非常 类似于SQL的查询模型,有时该模型也可从字符中解析。由于把查询定义为常规的Java对象,就能容易地 解析查询(取决于底层技术),并能根据底层技术细节选择最佳的执行策略。这意味着MetaModel不仅提 供了一个接口,还提供了一个完整的查询引擎,这个引擎在查询时可以处理部分或者全部任务。如果你 使用的是关系型JDBC数据库,会在数据库的本地引擎上执行99%的查询。但是如果使用了MetaModel,就 可以利用它的查询引擎把数据切片、切块,就能在CSV文件或Excel电子表格上执行同样的查询了。同时 ,你根本不必修改查询语句。

当然,这得假设你数据存储的元数据与数据结构是兼容的。不同的 数据存储以不同的方式暴露或推理元数据。JDBC数据库通常会通过JDBC元数据API暴露元数据。文件格式 (比如CSV和Excel表格)并没有很明确地定义,通常可以读取文件的首行内容获取它们的元数据。还有 种比较极端的情况,有一些NoSQL数据库甚至根本就没有元数据。MetaModel可以让你选择暴露元数据的 方式,你可以指定是以编程方式暴露,或通过检查数据存储的前N条记录的方式来推理出元数据。

MetaModel中最核心的设计是DataContext接口,它表示数据存储,可以用它来浏览和查询该数据 存储。此外,它的子接口UpdateableDataContext表示可写的数据存储,可以用它更新数据。一旦你拥有 了DataContext实例,就可以或多或少地学习使用类库代码补全的功能了。这里有几个DataContext实现 的典型示例,让我们来看看它们是如何实例化的:

// a DataContext for a CSV file
UpdateableDataContextcsv = new CsvDataContext(new File(“data.csv”));  

       // a DataContext for an Excel spreadsheet
UpdateableDataContext excel = new ExcelDataContext(new File(“spreadsheet.xlsx”));  

       // a DataContext for a JDBC database (can use either DataSource or Connection)
java.sql.DataSourcedataSource = …
UpdateableDataContextjdbc = new JdbcDataContext(dataSource);  

       // a DataContext for an XML file (where metadata is automatically inferred)
DataContext xml = new XmlDomDataContext(new File(“data.xml”)); 

       // a DataContext for connecting to Salesforce.com’s data web services
UpdateableDataContextsalesforce =
newSalesforceDataContext(username, pw, securityToken);  

       // a in-memory DataContext for POJOs (useful for testing and mocking)
          Person record1 = ...
          Person record2 = ...
TableDataProvidertableDataProvider = new ObjectTableDataProvider(
             “persons”, Person.class, Arrays.asList(record1, record2));
UpdateableDataContextpojos = new PojoDataContext(“schema”, tableDataProvider);

对于MetaModel来说元数据极为重要,它不仅用来管理数据结构,而且还用来定义查询。如果 你的查询要确保使用了适当的元数据,就需要投入大量的精力保证查询的安全性。因此,作为一名开发 人员,你在查询之前就要持有元数据对象。举例来说,如果你知道有一张表,表名是ORDER_LINE,它有 一列是price,另一列是order_id,那么就可以用寻常的硬编码方式去查询所需的元数据(显然,只有你 熟悉数据存储时才能使用这种方式):

DataContextdataContext = ... // the DataContext 

object represents the ‘connection’
          Table orderLines = dataContext.getTableByQualifiedLabel(“ORDER_LINES”);
          Column price = orderLines.getColumnByName(“price”);
          Column orderId = orderLines.getColumnByName(“order_id”);

此外,你还可以使用API基于探索的方式动态获取元数据。当你想为用户提供定制查询时,这 种方式就能发挥巨大的作用了,你可以用这种方式为用户提供可用的表和列,让用户自己选择所需的查 询。

Schema[] schema = dataContext.getSchemas();
Table[] tables = schemas[0].getTables();
Column[] columns = tables[0].getColumns();

MetaModel还一个非常重要的思想,它把元数据、查询和其他数据交互都当作是对象。查询在 MetaModel中就是一个普通的Java对象,所以你可以在执行之前篡改它,也可以把它分发出去。这使应用 程序可以创建由不同代码块协作完成的复合工作流程,在优化查询计划时就不必再面对冗长的SQL字符串 操作了。它对类型安全也很有帮助,举例来说,查询模型是基于像列、表等类型安全的结构来描述模型 的,而不是采用模糊不清的字符串常量。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
, 数据
, 查询
, 数据存储
, 一个
, 方式
, 跨数据库查询
, sql跨数据库查询
java解析csv文件
,以便于您获取更多的相关知识。

时间: 2024-07-30 14:59:10

MetaModel:跨多种数据存储提供统一的数据访问的相关文章

Nexenta推新品为主存储提供联线重复数据删除

近日,开放式存储解决方案的供应商Nexenta Systems推出了NexentaStor 3.0和虚拟机数据中心(VMDC)3.0,前者是该公司企业级存储解决方案基于文件系统ZFS的重大升级,后者是其最新版本的虚拟化管理平台.新版NexentaStor 3.0是首个整合了基于ZFS的联线重复数据删除技术的商业存储解决方案,为存储行业带来质的飞跃.NexentaStor 3.0还可支持Microsoft Hyper-V,使其成为唯一支持所有主流虚拟化环境的存储解决方案.随着此次新品的推出,Nex

android 数据存储-关于安卓的数据存储问题

问题描述 关于安卓的数据存储问题 我在网上看到很多篇关于安卓的数据保存的文章,大概知道有哪几种方式,但是现在的情况令我不知道怎么选择,希望各位给点建议! 情况是: 我需要1秒内保存3-5段数据,每段数据都是字符串而且没有固定长度,一共会接收到的数据大小在256byte-1k之间. 原本想用文件去保存数据的,但是数据是一段一段来的,而且间隔很短,我不知道文件操作的速度是不是可以跟上!?

在android开发中进行数据存储与访问的多种方式介绍_Android

数据存储与访问 很多时候我们的软件需要对处理后的数据进行存储或再次访问.Android为数据存储提供了多种方式,分别有如下几种: 文件 SharedPreferences SQLite数据库 内容提供者(Content provider) 网络 使用文件进行数据存储 首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. 复制代码 代码如下: public clas

《大数据管理概论》一3.2 大数据存储与管理方法

本节书摘来自华章出版社<大数据管理概论>一书中的第3章,第3.2节,作者 孟小峰,更多章节内容可以访问"华章计算机"公众号查看 3.2 大数据存储与管理方法 闪存.PCM等新型存储介质的引入使得大数据存储架构有了多种选择.但由于新型存储介质在价格.寿命等方面与传统的磁盘相比不具优势,因此目前主流的观点是在大数据存储系统中同时使用新型存储介质和传统存储介质,由此产生了多种基于新型存储的大数据存储架构,如基于PCM的主存架构.基于闪存的主存扩展架构.基于多存储介质的分层存储架构

《虚拟数据中心构建指南》——3.6 数据存储

3.6 数据存储 在VMware中,存储空间被称作数据存储(datastore).数据存储是保存VM.模板或者ISO映像的存储资源的虚拟表现形式.数据存储隐藏了不同技术和存储解决方案的复杂性,为ESX服务器提供一个统一的模型,无须考虑实现的存储类型.数据存储的类型有VMFS和NFS. 注意:VMware的最佳实践建议适当地将用于存储模板或者ISO映像的数据存储与用于VM的数据存储分离.我们还建议监控数据存储的可用空间.应该始终有至少25%至30%的可用空间.这些空间对快照或者备份操作以及VM交换

Uber是如何使用MySQL设计可扩展性数据存储的?

在Mezzanine项目中我们描述了我们是如何将Uber的核心行程数据从单个的Postgres节点迁移到Schemaless,这是我们开发的一个容错性很高.可用的数据存储. 根据Uber工程师的习惯使用MySQL设计的数据存储,使我们可以从2014 扩容到更高.本文分成三部分对Schemaless进行阐述. 一.Schemaless的总体设计   这一部分我们将讲述Schemaless的架构它在Uber基础结构中的角色以及他是如何成为该角色的. 1.我们对新数据库的迫切需求 2014年初,由于出

大话无线客户端安全之数据存储安全——Android篇

1 前言        随着无线客户端的火热发展,大家往往将所关注的重点放到了业务本身上,而忽视了安全问题.但是随着近年来各种层出不穷的与客户端相关的攻击事件以及安全漏洞的曝出,客户端安全已经不容忽视,忽视了安全必将会受到安全的惩罚.        而在各种安全之中数据安全更是重中之重,毫不夸张的说数据安全可以说是无线客户端安全的灵魂.用户的重要数据一旦损失掉,将会对应用乃至企业造成巨大的负面影响.例如去年发生的CSDN的用户名密码泄露事件:和无线客户端相关的有Skype Android版的用户

冷热分治,DT时代的数据存储必由之路

爆炸式增长的数据如何处理? 60秒的时间内可以做那些事呢?打字员可以打80个字,YouTube的用户可上传长达72小时的视频--言归正传,60秒,也就是一分钟内在互联网上到底发生了什么事呢? 在一分钟内,邮箱用户总共发送了2.04亿封邮件,亚马逊官网上的销售额约达到了8.3万美元,再说说社交网络上,Facebook的用户约推送了246万条的内容,Twitter用户发推数量约为27.7万条-- 在这组数字表象的背后,不知道你有没有发现需要哪些支撑?让我们简单算一下,按照目前3.2ZB的数据量,需要

简化数据存储技术并不简单

如今,全闪存阵列和超融合存储已成为两种难以简化数据存储技术的技术. 人们曾经认为数据存储是一种简单的技术,具有相当逻辑的替代方案.然而,有很多人表示现在查看当前的数据存储环境,不知道这些东西为什么变得这么复杂. 行业专家曾表示,在数据存储世界中,可以选择的方案在过去几年中急剧增长,但却有更多试图解决的存储问题.各种数据存储技术从媒体到阵列设计,以软件为中心的方法到全新的架构.新的数据存储场景将变得更加复杂,进一步强调存储的演变是一个真正的好消息. 人们有选择是很好的,这是一个好消息.但是太多的选