Massive Data处理一直是云计算中很重要的一个环节.目前像Google,Yahoo在相关方面都有自己专有的技术.例如Google的基于MapReduce的Sawzall语言.和Yahoo基于Hadoop的Pig。

  Cosmos是微软的一个运行在大规模服务器集群上的分布式技术平台.专门用来存储和分析Massive Data.有了SCOPE,相信微软自己的云计算架构将会更有吸引力.不同于Google,和Yahoo的是微软的SCOPE语言虽然像SQL语句,但其实是来自C#语言扩展。

什么是Scope?,首先:

  1.Scope is the Query Language for Cosmos

  2.Scope Is Not SQL

Scope 中的数据类型:

  

bool

Long

byte[]

Ulong

binary (an alias for byte[])

Float

byte

Double

sbyte

decimal

Char

String

Guid

Short

Int

ushort

Uint

User-Defined Types


Scope基本语法

逻辑运算符:AND(与,不能用 &&),OR(或,不能用 ||),==(等于,不能用 =)

SELECT:与SQL相同,通过 AS 关键字给列分配名称。

rs1 =
SELECT  Market, DwellTime + 1.0 AS DwellTime2
FROM searchlog; 

WHERE:过滤输入的行数据; 

rs1 =
    SELECT Start, Market, DwellTime, DwellTime /60.0 AS DwellTimeInMinutes
    FROM searchlog;
rs2 =
    SELECT *
    FROM rs1
    ; 

HAVING:过滤输出的行数据;

rs1 =
    SELECT Start, Market, DwellTime/60.0 AS DwellTimeInMinutes
    FROM searchlog
    ; 

TOP n:获取前n行记录;

 rs1 =
     Market, DwellTime
    FROM searchlog; 

DISTINCT:用法与SQL相同;

 rs1 =
    SELECT DISTINCT Market 
FROM searchlog;

ORDER BY + ASC /DESC:

rs1 =
    SELECT Start, Market, DwellTime
    FROM searchlog
    ORDER BY DwellTime ASC; 

RANK:列序号;

 rs1 =
    SELECT RANK AS RowNumber, Start, Market
    FROM searchlog
    ORDER BY Start;

聚集函数:

ARGMAX	AVG	COUNT	COUNTIF
FIRST	LAST	 LIST
MAX	MIN 	SUM	VAR	STDE

ARGMAX(a,b): 查找a列的最大值,并返回相应的b列的值。

UNION DISTINC:后续

UNION ALL:后续

INSERT DISTINC:后续

INSERT ALL:后续

EXCEPT DISTINC:后续

EXCEPT ALL:后续

关联操作(与SQL相同,不做详细介绍):

INNER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
CROSS JOIN (没有限制条件的 INNER JOIN  )
LEFT SEMIJOIN (Is more like a filter than a join. It is the syntactical way of expressing)
RIGHT SEMIJOIN 

预处理参数:

#DECLARE str1 string = "Hello World";
#DECLARE str2 string = "BEGIN" + @str1 + "END";
#}END", @str1);
#"); 

脚本参数:

@@foo@@

类型转换:部分类型可以相互转换

rs1 =
SELECT Market,  ((double) DwellTime) AS DwellTimeDouble
FROM searchlog; 

调用 C# 方法:MyHelper.SecondsToMinutes() 是c#语言定义的方法

rs1 =
SELECT  Market, MyHelper.SecondsToMinutes(DwellTime) AS DwellTimeInMinutes
 FROM searchlog;

三目运算:

cond ? a : b
IF (<cond>, <a>, <b> ) 

非结构化文本流

  Scope处理的内容(输入和输出)可以分为结构化文本流和非结构化文本流。其中,结构化文本流(.ss文件)中包含了列名,数据类型等数据(Schema),并且已经确定了各行以及各列的数据结构,你可以把它看作是数据库中的一张表,因此我们一般不会手动修改.ss文件中的内容。而非结构化文本流一般为普通的文本文件,没有明确规定列名以及格式,甚至是每行和每列的分隔符。但是一般情况下,我们更习惯用Tab(\t)作为列分隔,换行(\n)作为行分隔。

非结构化文本流基本概念:

  • 不适用SSTREAM;
  • 使用 提取器 (Extrator) 提取并转换 行集 (Rowset)
  • 使用 输出器(Outputer) 输出 流(Stream)
  • 默认的提取器和输出器,以及用户自定义的提取器和输出器

读取非结构化文本流使用 EXTRACT 关键字,需要指定Extractor ,当然你也可以使用默认的Extractor,用法如下:

rs0 =
    EXTRACT
        FirstName : string,
        LastName : string,
        Age : int
    FROM
        "/test_input.txt"
    USING DefaultTextExtractor()
    ;

DefaultTextExtractor() 以Tab(\t)作为列分隔符。当然,你也可以自己实现一种Extractor,来读取文本内容:

public class MyExtractor : Extractor
{
    public override IEnumerable<Row> Extract(StreamReader reader, Row outputRow, string[] args)
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            var urls = new List<string>();
            string[] datas = line.Split('\t');
            ].Split(';');

            foreach(var item in urlDatas)
            {
                if(!string.IsNullOrEmpty(item))
                {
                    outputRow[].UnsafeSet(datas[]);
                    outputRow[].UnsafeSet(item);
                    yield return outputRow;
                }
            }
        }
    }

    public override Schema Produces(string[] requestedColumns, string[] args)
    {
        return new Schema("Name:string,Email:string");
    }
}

对应的Scope脚本:

input =
    EXTRACT *
    FROM @"input\test.txt"
    USING MyExtractor();

OUTPUT input
TO "result.txt";

以及输入输出:

input\test.txt:
Jadfine	djatr@outlook.com;tojadfine@outlook.com
Kinsan	kjmint@outlook.com;sun308@outlook.com;kin_sun@hotmail.com
result.txt:
Jadfine	djatr@outlook.com
Jadfine	tojadfine@outlook.com
Kinsan	kjmint@outlook.com
Kinsan	sun308@outlook.com
Kinsan	kin_sun@hotmail.com

  和我们预想的一样,第二列的Emails 以 ;作为分隔符被分隔成了多条记录。还要特别说明一下,我们要使用自己定义的Extractor,需要继承ScopeRuntime.Extractor类,并重写Extract和Product方法。

  Extract方法有三个参数:IEnumerable<Row> Extract(StreamReader reader, Row outputRow, string[] args) 。其中StreamReader 读的是  FROM @"input\test.txt" 中的内容。Row是要输出的行,其中包含 Name(string 类型),Email(string 类型)两列。Row的数量,名称是由Product方法定义的。关于如何通过重写Product方法修改,新增,删除列,将在后续介绍。最后一个参数 string[] args 传递的是我们在Scope脚本中调用此方法时传递的参数,如:  USING MyExtractor("arg1","arg2");


结构化文本流

后续。。

微软云计算 Massive Data 处理语言Scope 1的更多相关文章

  1. [书目20140902]实战Windows Azure——微软云计算平台技术详解 --徐子岩

    目录第1章  云计算技术简介    1.1  云计算所要解决的问题    1.2  云计算平台的分类    1.3  微软云计算平台Windows Azure        1.3.1  高可用性   ...

  2. Multithreading C++ Out of Core Sotring for Massive Data|多线程C++的大规模数据外部排序

    先说一下,这个其实是我为实现PantaRay或者是类似Dreamworks的Out of Core点云GI的技术储备,为大规模点云光线跟踪所准备的第一步.在实际的应用中,int类型会被64bit的ui ...

  3. 高手问答精选:Go 语言 —— 云计算时代的 C 语言(类似于一个FAQ)

    Go 语言被称为云计算时代的 C 语言,它在软件开发效率和运行效率之间做出了绝佳的权衡.这使得它既适应于互联网应用的极速开发,又能在高并发.高性能的开发场景中如鱼得水.正因如此,许多互联网公司,尤其是 ...

  4. MindV编入微软云计算中小企业解决方案

    鹰翔MindV思维导图软件基于云计算,曾作为windows azure云计算的一个样例介绍,收入中小企业解决方案中.http://www.microsoft.com/hk/smb/cloud/azur ...

  5. Interviews3D: APlatform for Interactive Handing of Massive Data Sets 读后感

    横向比较: Inadequacy of current system design( 现代系统和一些软件的不足) 软件特点: Output sensitivity Out-of core data h ...

  6. Massive Data Mining学习记录

    第一周: 学习PageRank, 知识点:每个节点的权值由其他节点的投票决定,所有节点的权值和为1 当节点很多时候必须转换成矩阵运算来计算节点的最终值,由马尔可夫链可以证明,这个值可以迭代得到 问题: ...

  7. 微软的R语言发行版本MRO及开发工具RTVS

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软在收购R语言的开发商后,也独立发行或在自己的产品中集成了R语言,这里就介绍下它们包 ...

  8. Win7 SP1语言包微软官方下载地址及使用方法 2

    情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...

  9. C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库

    由于微软在.Net框架4.0中已经决定撤销使用System.Data.OracleClient,造成在VS2010中无法连接Oracle数据库,但它还依旧存在于.Net架构中,我们可以通过自己引用 C ...

随机推荐

  1. cf290-2015-2-3总结与反思(dfs判断无向图是否有环)

    bool dfs(int i,int pre) { visit[i]=true; ;j<=v;j++) if(g[i][j]) { if(!visit[j]) return dfs(j,i); ...

  2. junit搭配hamcrest使用

    开篇 - 快速进行软件编码,与功能测试应该是每个写代码的人,应该掌握的技能,如何进行优雅的写代码,把测试的时间压缩,腾出时间来休息.下面听我一一道来: 依赖:junit 4.4 hamcrest 1. ...

  3. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  4. Visual Studio中让一个JS文件智能提示另一个JS文件中的成员

    当一个Web页面引用了两个JS文件(假如分别叫common.js和JScript1.js),如果JScript1.js中需要调用大量的common.js中的方法,这时候在JScript1.js中智能提 ...

  5. C#常用单元测试框架比较:XUnit, NUnit, 和 Visual Studio(MSTest)

    做过单元测试的同学大概都知道以上几种测试框架,但我一直很好奇它们到底有什么不同,然后搜到了一篇不错的文章清楚地解释了这几种框架的最大不同之处. 地址在这里:http://www.tuicool.com ...

  6. Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027

    MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...

  7. Java基础-Eclipse环境搭建(02)

    Eclipse工具 IDE(Integrated Development Environment)集成开发环境集成了编写功能,分析功能,编译功能一体化的开发软件. 调试功能等,其中编译在保存时运行(即 ...

  8. Java基础——数据类型

    Java中与C++的区别: 1.Java中没有无符号类型. 2.整型值和布尔值之间不能进行相互转换. 3.Java中不区分变量的定义和声明. 如:在C++中int i = 10;是一个定义,而exte ...

  9. 一台服务部署多个tomcat注意事项

    第一步  添加tomcat环境变量 # vim /etc/profile加入下代码 # TOMCAT ATALINA_BASE=/usr/local/tomcat8CATALINA_HOME=/usr ...

  10. Flex 基础语法(三)

    2.flex-wrap 默认情况下,项目都排在一条线(又称"轴线")上.flex-wrap属性定义,如果一条轴线排不下,如何换行 属性 含义 nowrap(默认值) 不换行 wra ...