Massive Data处理一直是云计算中很重要的一个环节.目前像Google,Yahoo在相关方面都有自己专有的技术.例如Google的基于MapReduce的Sawzall语言.和Yahoo基于Hadoop的Pig。
对于大数据处理,Cosmos是微软的一个运行在大规模服务器集群上的分布式技术平台.专门用来存储和分析Massive Data.而Scope是运行在Cosmos环境下的数据处理工具。有了Scope,相信微软自己的云计算架构将会更有吸引力.不同于Google,和Yahoo的是微软的Scope语言虽然像SQL语句,但其实是来自C#语言扩展。
什么是Scope?它更像是在SQL中插入C#方法的复合语言,结合了SQL处理格式化数据便捷等优点和C#能灵活处理文本内容等优点,是处理大数据的利器。其次:
1.Scope is the Query Language for Cosmos(Scope是在Cosmos平台下运行的Query语言)
2.Scope Is Not SQL (Scope像SQL 但不同于SQL)
Scope基本语法
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 |
逻辑运算符: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
- WHERE DwellTimeInMinutes >= 20;
HAVING:过滤输出的行数据:
- rs1 =
- SELECT Start, Market, DwellTime/60.0 AS DwellTimeInMinutes
- FROM searchlog
- HAVING DwellTimeInMinutes >= 20;
TOP n:获取前n行记录:
- rs1 =
- SELECT TOP 5 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";
- #DECLARE str3 string = string.Format("BEGIN{0}END", @str1);
- #DECLARE date0 DateTime = DateTime.Parse("2010/03/31");
脚本参数(外部参数):
- @@foo@@
类型转换:部分类型可以相互转换,包括值类型和引用类型。这里先做简单介绍,后续将附上更多例子。
- rs1 =
- SELECT Market, ((double) DwellTime) AS DwellTimeDouble
- FROM searchlog;
调用 C# 方法:MyHelper.SecondsToMinutes() 是c#语言定义的方法,这是Scope最大的特点,SQL与C#方法相结合。
- rs1 =
- SELECT Market, MyHelper.SecondsToMinutes(DwellTime) AS DwellTimeInMinutes
- FROM searchlog;
三目运算:
- IF
- (
- <
- cond
- >
- ,
- <
- a
- >
- ,
- <
- b
- >
- )
非结构化文本流
Scope处理的内容(输入和输出)可以分为结构化文本流和非结构化文本流。其中,结构化文本流(.ss文件)中包含了列名,数据类型等数据(Schema),并且已经确定了各行以及各列的数据结构,你可以把它看作是数据库中的一张表,因此我们一般不会手动修改.ss文件中的内容。而非结构化文本流一般为普通的文本文件,没有明确规定列名以及格式,甚至是每行和每列的分隔符。但是一般情况下,我们更习惯用Tab(\t)作为列分隔,换行(\n)作为行分隔。
非结构化文本流基本概念:
读取非结构化文本流使用 EXTRACT 关键字,需要指定Extractor ,当然你也可以使用默认的Extractor,用法如下:
- rs0 =
- EXTRACT
- FirstName : string,
- LastName : string,
- Age : int
- FROM
- "/test_input.txt"
- USING DefaultTextExtractor()
- HAVING Age > 40;
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');
- var urlDatas= datas[1].Split(';');
- foreach(var item in urlDatas)
- {
- if(!string.IsNullOrEmpty(item))
- {
- outputRow[0].UnsafeSet(datas[0]);
- outputRow[1].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
结构化文本流
在讨论结构化文本流前先介绍一下 Outputer 以及 Processor
你需要自己实现Outputer,USING Outputer 后将按你的要求输出文本流,
- input =
- EXTRACT Name:string,
- Email:string
- FROM @"input\SearchLog.txt"
- USING DefaultTextExtractor();
- query =
- PROCESS input
- PRODUCE *
- USING MyProcessor();
- OUTPUT query
- TO "output.txt"
- USING MyOutputter();
- public class MyOutputter : Outputter
- {
- public override void Output(RowSet input, StreamWriter writer, string[] args)
- {
- foreach (Row row in input.Rows)
- {
- int c = 0;
- for (int i = 0; i < row.Count; i++)
- {
- if (c > 0)
- {
- writer.Write("-");
- }
- row[i].Serialize(writer);
- c++;
- }
- writer.WriteLine();
- writer.Flush();
- }
- }
- }
以上代码定义和使用的 Outputer 将以 ‘-’ 作为列的分隔符输出文本内容。输出的output.txt:
Jadfine-djatr@outlook.com
Jadfine-tojadfine@outlook.com
Kinsan-kjmint@outlook.com
Kinsan-sun308@outlook.com
Kinsan-kin_sun@hotmail.com
Processer 可以处理输入后的数据:
后续。
来源: http://www.cnblogs.com/zactor/p/7761433.html