Sawzall語言概覽
作為一種查詢語言,Sawzall是一種類型安全的腳本語言。由於Sawzall自身處理了很多問題,所以完成相同功能的代碼就簡化了非常多-與MapReduce的C++代碼相比簡化了10倍不止。
Sawzall語法和表達式很大一部分都是從C照搬過來的;包括for循環,while循環,if語句等等都和C裡邊的很類似。定義部分借鑑了傳統Pascal的模式:
i: int ; # a simple integer declaration;
i: int=0; # a declaration with an initial value;
基本類型包括整數(int),是64位有符號值;浮點數(float),是一個double精度的IEEE浮點數;以及很類似整數的time和fingerprint。time是毫秒級別的時間,並且函式館包括了對這個類型的轉換和操作。fingerprint是一個執行定義的hash值,可以很容易通過建立數據的fingerprint來構造聚合器索引。
同時,Sawzall也有兩種基本的數組類型:bytes,類似C的unsigned char的數組;string,string用來存放UNICODE的字元串。在Sawzall中沒有”字元”類型;byte數組和string的基本元素是int,而雖然int的容量遠比位元組或者字元串的基本元素來得大。
複合類型包括數組,maps(本文檔中是可以重載概念),tuples。數組是用整數作為下標檢索的,maps是結合了數組或者Python字典的類型,可以用任意類型檢索,可以根據需要建立無序的索引。最後tuples是對數據的任意分組,類似C或者PASCAL的結構類型。任何類型都可以有一個正式的名字。
類型轉換操作是把數據從一種類型轉換成為另一種類型,並且Sawzall提供了很廣泛的類型轉換。例如,把一個字元串表示的浮點數轉換成為一個浮點數:
f: float;
s: string = "1.234";
f = float(s);
部分轉換是可以帶參數的:
string(1234, 16)
就可以把一個整數轉換成為一個16進制的字元串。並且:
string(utf8_bytes, "UTF-8")
轉換一個UTF-8的byte數組成為一個unicode字元串。
為了方便起見,並且為了避免某些語言定義上的囉嗦,編譯器可以在初始化定義的時候隱含的左適當的轉換操作(使用預設的轉換參數)。因此:
b: bytes = "Hello, world!\n";
等價於顯示的轉換:
b: bytes = bytes("Hello, world!\n", "UTF-8");
任何類型的值都可以轉換成為字元串,這是為了調試的方便考慮。
Sawzall最重要的轉換是和協定buffer相關的。Sawzall有一個編譯時刻參數:Proto,有點類似C的#include指令,可以從一個定義了Sawzall tuple類型的檔案載入DDL協定buffer。通過tuple描述,就可以轉換輸入的協定buffer到Sawzall的值了。
對於每一個輸入記錄,解釋器都需要把這個由二進制數組表達的值初始化到特定的輸入變數中,尤其是轉換到協定buffer類型的輸入變數中去。Sawzall程式對於每一個記錄的執行都是由下邊這條語句隱式執行的:
input: bytes = next_record_from_input();
因此,如果檔案:some_record.proto包含了類型Record的協定buffer的定義,那么下邊的代碼會把每一個輸入記錄分析道變數r中:
proto "some_record.proto" # define ’Record’
r: Record = input; # convert input to Record
Sawzall有很多其他的傳統特性,比如函式以及一個很廣泛的選擇基礎函式館。在基礎函式館中是給調用代碼使用的國際化的函式,文檔分析函式等等。