kdb q介绍
Kx systems公司的創始人之一Arthur Whitney在2003年研發了列式數據庫KDB和它的操作語言q。q也可以寫成Q。設計之初,q語言要做到簡潔,高效和富表達性。
q的起源受到多種語言的啟示。包括APL、LISP和函數式編程。
APL是一個向量語言,所以Q也具有向量語言的一些特點:
- 處理大批量數據時非???/li>
- 處理數據的基本單元 - 列表
Q不只于此,q在處理關系型數據時也非常快。q支持SQL 92標準,并在這個基礎上加上了一些特有的sql特性和豐富的內置函數。
LISP語言處理的數據是通過list這種形式,q同樣是通過list的形式。另外q還擁有許多函數式編程的特點。雖然q并不完全是一個函數式編程語言,但函數編程之于q,相當于面向對象之于Java/C#。
Q特點
Q設計的時候,考慮到現有數據處理系統的弊端。事實上我們現在涉及數據處理的系統,面臨著非常復雜的數據轉化過程。例如:
- 從對象轉到數據庫表
- 從對象轉到網絡傳輸模型(xml)
- 各種各樣的類
。q的出現能夠較好的解決這些問題。Q的設計思想與之前所學的大部分語言是如此的不同,以至于我們在這里有必要讓大家先調整好思維方式再去查看語法細節。如果用一句話來描述q的特點,它是.....。許多各種各樣的特點
- 內存內的數據庫:理解KDB的一種方式就是KDB是一個內存數據庫,但擁有磁盤可持久化能力。
- 解釋性語言 :開發周期更短
- 列表是有順序的 :不同于數據庫中的行,因為列表有序,所以數據表也有序
- 從右往左解析?
- 面向表
- 面向列:關系型數據庫按行處理數據和存儲數據,kdb是按列存數據,對數據進行運算也是直接作用在列向量上。
- 強類型
- Null值擁有特殊含義?
- 內置I/O的支持?
數學復習課
q語言和數據的相關性太緊密了,以至于我在這里有必要復習一下一些基本的數據函數知識。實際上,絕大部分的q結構和操作都可以理解為方法映射。
對于一個函數,其輸入值組成的域稱為domain,值域稱為range。通常我們有兩種方式來描述算法/方法。一是公式法,可以寫成
f(x) = x2?
另外一個是圖形表示
| I | O |
| 0 | 0 |
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
?其中I是輸入,O是輸出。??
根據函數參數數量的不同,我們又將函數分成幾類:
- monadic:只有一個參數
- dyadic:有兩個參數
- nildic:沒有參數
如果一個g的值域是f的domain,那么這個函數組合可以寫成f(g(x))。
(在下文中,我們稱數學函數為map/mapping,稱q方法為function。
簡單操作
從官方網站下載試用版本后,解壓相應的文件到安裝目錄,例如在windows上推薦解壓到c盤。
然后打開命令窗口,切換到如下目錄,并執行q。
變量: 與其他語言相似,變量也是用于存儲和表示數據的地方。在q中,變量的聲明和賦值在一個語句中完成。變量的賦值符,并不是=,而是:q變量必須以字母開頭,可包含字母,_和數字。?
命名規則推薦:
????????? 使用動詞表示操作符和方法,使用名詞表示數據?
????????? 使用較為簡潔的名字。Use contexts for namespacing.
q的專業編寫人員總是會省略掉很多不必要的空格。但這并不一定是強制的要求,我們可以在提高可讀性的情況下,加入一些空格。比較推薦加空格的地方包括,逗號,分號和juxpositon后面。
在q里面,語言的注釋是通過/來完成的。另外注釋符和表達式之間需要一個空格來分割。
變量類型
q的變量其實并不帶類型信息。類型信息附屬在變量的那種之上。
初次使用q的人,肯定會被他的解析順序所迷惑。例如下面這樣的表達式,對于其他語言的使用者來說肯定是前所未聞的:
q) 1+a:43
44
q將表達式從右向左解析。所以這個表達式可以理解為 將43賦值給a,再將a加上1,最后向console 打印結果。在q中,表達式是允許一個剛剛被賦值的變量參與運算的。
Atoms
All data is ultimately built from atoms, so we begin with atoms.An?atom?is an irreducible value with a specific data type.
the following table collects all important information for q data type and atoms:
| type | size | char type | num type | notation | null value |
| boolean | 1 | b | 1 | 1b | 0b |
| byte | 1 | x | 4 | 0x26 | 0x00 |
| short | 2 | h | 5 | 42h | 0Nh |
| int | 4 | i | 6 | 42 | 0N |
| long | 8 | j | 7 | 42j | 0Nj |
| real | 4 | e | 8 | 4.2e | 0Ne |
| float | 8 | f | 9 | 4.2 | 0n |
| char | 1 | c | 10 | "z" | " " |
| symbol | * | s | 11 | ‘zaphod | ` |
| month | 4 | m | 13 | 2006.07m | 0Nm |
| date | 4 | d | 14 | 2006.07.21 | 0Nd |
| datetime | 4 | z | 15 | 2006.07.21T09:13:39 | 0Nz |
| minute | 4 | u | 17 | 23:59 | 0Nu |
| second | 4 | v | 18 | 23:59:59 | 0Nv |
| time | 4 | t | 19 | 09:01:02:042 | 0Nt |
| enumeration | | | * | `u$v | |
| dictionary | | | 99 | `a`b`c!!10 20 30 | |
| table | | | 98 | ([] c1:ab`c; c2:10 20 30) |
Integer data
int => 123
short=> 234h (h is compulsory)
long => -23423j (j is compulsory)
Type promotion is performed automatically in q primitive operations. However, if a specific integer type is required in a list and a narrower type is presented?. then an error will be prompt.
floating point data
float => pi:3.23423 or pi:1f
real => 1.23423e
we can user scientific notation for both float and real.
By default, the q console displays only seven decimal digits of accuracy for float and real . we can change this by \P 12
binary data
boolean => bit:0b
byte => by:0x2a
charactor:
char => ch:"q" or ch:"\n"
symbol => s1:`q
note that symbol is the smallest unit of the data, can't be reduced.
總結
- 上一篇: C++判断文件夹是否存在
- 下一篇: mfc对话框在不同计算机上显示不全