KDB + - Panduan Cepat

Ini adalah pernyataan yang tepat kdb+dari sistem kx, ditujukan terutama untuk mereka yang belajar secara mandiri. kdb +, diperkenalkan pada tahun 2003, adalah generasi baru dari database kdb yang dirancang untuk menangkap, menganalisis, membandingkan, dan menyimpan data.

Sistem kdb + berisi dua komponen berikut -

  • KDB+ - database (k database plus)

  • Q - bahasa pemrograman untuk bekerja dengan kdb +

Kedua kdb+ dan q ditulis dalam k programming language (sama dengan q tetapi kurang terbaca).

Latar Belakang

Kdb + / q berasal dari bahasa akademis yang tidak jelas tetapi selama bertahun-tahun, bahasa ini secara bertahap meningkatkan keramahan penggunanya.

  • APL (1964, Bahasa Pemrograman)

  • A+ (1988, APL dimodifikasi oleh Arthur Whitney)

  • K (1993, versi segar dari A +, dikembangkan oleh A.Whitney)

  • Kdb (1998, db berbasis kolom dalam memori)

  • Kdb+/q (2003, bahasa q - versi k yang lebih mudah dibaca)

Mengapa dan Di Mana Menggunakan KDB +

Mengapa? - Jika Anda memerlukan satu solusi untuk data waktu nyata dengan analitik, maka Anda harus mempertimbangkan kdb +. Kdb + menyimpan basis data sebagai file asli biasa, sehingga tidak memiliki kebutuhan khusus terkait perangkat keras dan arsitektur penyimpanan. Perlu diperhatikan bahwa database hanyalah sekumpulan file, sehingga pekerjaan administratif Anda tidak akan sulit.

Tempat menggunakan KDB +?- Mudah untuk menghitung bank investasi mana yang TIDAK menggunakan kdb + karena kebanyakan dari mereka sedang menggunakan atau berencana untuk beralih dari database konvensional ke kdb +. Karena volume data meningkat dari hari ke hari, kami membutuhkan sistem yang dapat menangani data dalam jumlah besar. KDB + memenuhi persyaratan ini. KDB + tidak hanya menyimpan sejumlah besar data tetapi juga menganalisisnya secara real time.

Mulai

Dengan latar belakang sebanyak ini, sekarang mari kita mulai dan belajar bagaimana mengatur lingkungan untuk KDB +. Kami akan mulai dengan cara mengunduh dan menginstal KDB +.

Mengunduh & Menginstal KDB +

Anda bisa mendapatkan KDB + versi 32-bit gratis, dengan semua fungsionalitas versi 64-bit dari http://kx.com/software-download.php

Setuju dengan perjanjian lisensi, pilih sistem operasi (tersedia untuk semua sistem operasi utama). Untuk sistem operasi Windows, versi terbaru adalah 3.2. Unduh versi terbaru. Setelah Anda mengekstraknya, Anda akan mendapatkan nama foldernya“windows” dan di dalam folder windows, Anda akan mendapatkan folder lain “q”. Salin seluruhnyaq ke folder c: / drive Anda.

Buka terminal Run, ketik lokasi tempat Anda menyimpan file qmap; itu akan menjadi seperti "c: /q/w32/q.exe". Setelah Anda menekan Enter, Anda akan mendapatkan konsol baru sebagai berikut -

Pada baris pertama, Anda dapat melihat nomor versi yaitu 3.2 dan tanggal rilis 2015.03.05

Tata Letak Direktori

Versi uji coba / gratis umumnya dipasang di direktori,

For linux/Mac −

~/q       / main q directory (under the user’s home)
~/q/l32   / location of linux 32-bit executable
~/q/m32   / Location of mac 32-bit executable

For Windows −

c:/q          / Main q directory
c:/q/w32/     / Location of windows 32-bit executable

Example Files −

Setelah Anda mengunduh kdb +, struktur direktori di platform Windows akan muncul sebagai berikut -

Dalam struktur direktori di atas, trade.q dan sp.q adalah file contoh yang dapat kita gunakan sebagai titik referensi.

Kdb + adalah database berkinerja tinggi dan bervolume tinggi yang dirancang sejak awal untuk menangani volume data yang luar biasa. Ini sepenuhnya 64-bit, dan memiliki pemrosesan multi-core dan multi-threading bawaan. Arsitektur yang sama digunakan untuk data real-time dan historis. Basis data menggabungkan bahasa kuerinya sendiri yang kuat,q, sehingga analitik dapat dijalankan langsung pada data.

kdb+tick adalah arsitektur yang memungkinkan pengambilan, pemrosesan, dan kueri data real-time dan historis.

Kdb + / centang Arsitektur

Ilustrasi berikut memberikan garis besar umum dari arsitektur Kdb + / tick yang khas, diikuti dengan penjelasan singkat tentang berbagai komponen dan aliran data.

  • Itu Data Feeds adalah data deret waktu yang sebagian besar disediakan oleh penyedia data feed seperti Reuters, Bloomberg, atau langsung dari bursa.

  • Untuk mendapatkan data yang relevan, data dari data feed diurai oleh feed handler.

  • Setelah data diurai oleh penangan umpan, data itu masuk ke ticker-plant.

  • Untuk memulihkan data dari kegagalan apa pun, pabrik ticker terlebih dahulu memperbarui / menyimpan data baru ke file log dan kemudian memperbarui tabelnya sendiri.

  • Setelah memperbarui tabel internal dan file log, data loop on-time terus dikirim / dipublikasikan ke database real-time dan semua pelanggan berantai yang meminta data.

  • Pada akhir hari kerja, file log dihapus, yang baru dibuat dan database real-time disimpan ke database historis. Setelah semua data disimpan ke database historis, database waktu nyata akan membersihkan tabelnya.

Komponen Arsitektur Kdb + Tick

Umpan Data

Umpan Data dapat berupa pasar apa pun atau data deret waktu lainnya. Pertimbangkan data feed sebagai input mentah untuk feed-handler. Umpan bisa langsung dari bursa (data streaming langsung), dari penyedia berita / data seperti Thomson-Reuters, Bloomberg, atau lembaga eksternal lainnya.

Penangan Pakan

Penangan umpan mengubah aliran data menjadi format yang cocok untuk menulis ke kdb +. Ini terhubung ke umpan data dan mengambil dan mengubah data dari format khusus umpan menjadi pesan Kdb + yang diterbitkan ke proses pabrik-ticker. Umumnya penangan umpan digunakan untuk melakukan operasi berikut -

  • Tangkap data sesuai dengan seperangkat aturan.
  • Terjemahkan (/ perkaya) data itu dari satu format ke format lainnya.
  • Tangkap nilai terbaru.

Tanaman Ticker

Pabrik Ticker adalah komponen terpenting dari arsitektur KDB +. Ini adalah pabrik ticker yang menghubungkan database real-time atau pelanggan langsung (klien) untuk mengakses data keuangan. Ini beroperasi dipublish and subscribemekanisme. Setelah Anda mendapatkan langganan (lisensi), publikasi centang (secara rutin) dari penerbit (pabrik ticker) ditentukan. Itu melakukan operasi berikut -

  • Menerima data dari penangan umpan.

  • Segera setelah pabrik ticker menerima data, ia menyimpan salinan sebagai file log dan memperbaruinya setelah pabrik ticker mendapatkan pembaruan apa pun sehingga jika terjadi kegagalan, kami tidak akan kehilangan data.

  • Klien (pelanggan real-time) dapat langsung berlangganan pabrik ticker.

  • Pada akhir setiap hari kerja, yaitu, setelah database waktu nyata menerima pesan terakhir, ia menyimpan semua data hari ini ke database historis dan mengirimkannya ke semua pelanggan yang telah berlangganan data hari ini. Kemudian me-reset semua tabelnya. File log juga dihapus setelah data disimpan dalam database historis atau pelanggan lain yang terhubung langsung ke database waktu nyata (rtdb).

  • Hasilnya, pabrik ticker, database real-time, dan database historis beroperasi selama 24/7.

Karena tanaman ticker adalah aplikasi Kdb +, tabelnya dapat di-query menggunakan qseperti database Kdb + lainnya. Semua klien pabrik ticker seharusnya hanya memiliki akses ke database sebagai pelanggan.

Database Real-Time

Database real-time (rdb) menyimpan data hari ini. Itu terhubung langsung ke pabrik ticker. Biasanya itu akan disimpan dalam memori selama jam pasar (sehari) dan ditulis ke database historis (hdb) di penghujung hari. Karena data (rdb data) disimpan dalam memori, pemrosesan menjadi sangat cepat.

Karena kdb + merekomendasikan untuk memiliki ukuran RAM yang empat kali atau lebih dari ukuran data yang diharapkan per hari, kueri yang berjalan di rdb sangat cepat dan memberikan kinerja yang unggul. Karena database real-time hanya berisi data hari ini, kolom tanggal (parameter) tidak diperlukan.

Misalnya, kita dapat memiliki kueri rdb seperti,

select from trade where sym = `ibm

OR

select from trade where sym = `ibm, price > 100

Database Historis

Jika kita harus menghitung perkiraan suatu perusahaan, kita perlu memiliki data historisnya. Database historis (hdb) menyimpan data transaksi yang dilakukan di masa lalu. Setiap rekor hari baru akan ditambahkan ke hdb di penghujung hari. Tabel-tabel besar dalam hdb baik disimpan terentang (setiap kolom disimpan dalam filenya sendiri) atau mereka disimpan dengan partisi oleh data temporal. Juga beberapa database yang sangat besar dapat dipartisi lebih lanjut menggunakanpar.txt (mengajukan).

Strategi penyimpanan ini (terhampar, dipartisi, dll.) Efisien saat mencari atau mengakses data dari tabel besar.

Database historis juga dapat digunakan untuk tujuan pelaporan internal dan eksternal, yaitu untuk analitik. Misalnya, kita ingin mendapatkan perdagangan perusahaan IBM untuk hari tertentu dari nama tabel perdagangan (atau apa pun), kita perlu menulis kueri sebagai berikut -

thisday: 2014.10.12

select from trade where date = thisday, sym =`ibm

Note - Kami akan menulis semua pertanyaan seperti itu setelah kami mendapatkan gambaran umum tentang q bahasa.

Kdb + hadir dengan bahasa pemrograman bawaan yang dikenal sebagai q. Ini menggabungkan superset dari SQL standar yang diperluas untuk analisis deret waktu dan menawarkan banyak keunggulan dibandingkan versi standar. Siapapun yang akrab dengan SQL bisa belajarq dalam hitungan hari dan dapat dengan cepat menulis kueri ad-hoc miliknya sendiri.

Memulai Lingkungan "q"

Untuk mulai menggunakan kdb +, Anda harus memulai qsidang. Ada tiga cara untuk memulai aq sesi -

  • Cukup ketik "c: /q/w32/q.exe" di terminal run Anda.

  • Mulai terminal perintah MS-DOS dan ketik q.

  • Salin q.exe file ke "C: \ Windows \ System32" dan di terminal run, cukup ketik "q".

Di sini kami mengasumsikan bahwa Anda bekerja pada platform Windows.

Jenis Data

Tabel berikut menyediakan daftar tipe data yang didukung -

Nama Contoh Arang Tipe Ukuran
boolean 1b b 1 1
byte 0xff x 4 1
pendek 23 jam h 5 2
int 23i saya 6 4
panjang 23j j 7 8
nyata 2.3e e 8 4
mengapung 2.3f f 9 8
arang "Sebuah" c 10 1
varchar.dll `ab s 11 *
bulan 2003.03m m 13 4
tanggal 2015.03.17T18: 01: 40.134 z 15 8
menit 08:31 u 17 4
kedua 08:31:53 v 18 4
waktu 18:03: 18,521 t 19 4
enum `u $` b, di mana u: `a`b * 20 4

Formasi Atom dan Daftar

Atom adalah entitas tunggal, misalnya satu bilangan, karakter, atau simbol. Pada tabel di atas (dari tipe data yang berbeda), semua tipe data yang didukung adalah atom. Daftar adalah urutan atom atau jenis lain termasuk daftar.

Meneruskan atom jenis apa pun ke fungsi jenis monadik (yaitu fungsi argumen tunggal) akan mengembalikan nilai negatif, yaitu, –n, sedangkan meneruskan daftar sederhana dari atom-atom tersebut ke fungsi type akan mengembalikan nilai positif n.

Contoh 1 - Formasi Atom dan Daftar

/ Note that the comments begin with a slash “ / ” and cause the parser
/ to ignore everything up to the end of the line.

x: `mohan              / `mohan is a symbol, assigned to a variable x
type x                 / let’s check the type of x
-11h                   / -ve sign, because it’s single element.

y: (`abc;`bca;`cab)    / list of three symbols, y is the variable name.

type y
11h                    / +ve sign, as it contain list of atoms (symbol).

y1: (`abc`bca`cab)     / another way of writing y, please note NO semicolon

y2: (`$”symbols may have interior blanks”)   / string to symbol conversion
y[0]                   / return `abc
y 0                    / same as y[0], also returns `abc
y 0 2                  / returns `abc`cab, same as does y[0 2]

z: (`abc; 10 20 30; (`a`b); 9.9 8.8 7.7)      / List of different types,
z 2 0                  / returns (`a`b; `abc),
z[2;0]                 / return `a. first element of z[2]

x: “Hello World!”      / list of character, a string
x 4 0                  / returns “oH” i.e. 4th and 0th(first)
element

Seringkali diperlukan untuk mengubah tipe data beberapa data dari satu tipe ke tipe lainnya. Fungsi transmisi standar adalah "$"dyadic operator.

Tiga pendekatan digunakan untuk melemparkan dari satu jenis ke jenis lainnya (kecuali untuk string) -

  • Tentukan tipe data yang diinginkan dengan nama simbolnya
  • Tentukan tipe data yang diinginkan berdasarkan karakternya
  • Tentukan tipe data yang diinginkan dengan nilai pendeknya.

Mentransmisikan Integer ke Floats

Dalam contoh berikut tentang casting bilangan bulat ke pelampung, ketiga cara pengecoran yang berbeda adalah setara -

q)a:9 18 27

q)$[`float;a]     / Specify desired data type by its symbol name, 1st way
9 18 27f

q)$["f";a]        / Specify desired data type by its character, 2nd way
9 18 27f

q)$[9h;a]         / Specify desired data type by its short value, 3rd way
9 18 27f

Periksa apakah ketiga operasi itu setara,

q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a])
1b

Mentransmisikan String ke Simbol

Mentransmisikan string ke simbol dan sebaliknya berfungsi sedikit berbeda. Mari kita periksa dengan sebuah contoh -

q)b: ("Hello";"World";"HelloWorld")    / define a list of strings

q)b
"Hello"
"World"
"HelloWorld"

q)c: `$b                               / this is how to cast strings to symbols

q)c                                    / Now c is a list of symbols
`Hello`World`HelloWorld

Mencoba mentransmisikan string ke simbol menggunakan simbol kata-kata kunci atau 11h akan gagal dengan kesalahan jenis -

q)b
"Hello"
"World"
"HelloWorld"

q)`symbol$b
'type

q)11h$b
'type

Mentransmisikan String ke Non-Simbol

Mentransmisikan string ke tipe data selain simbol dilakukan sebagai berikut -

q)b:900               / b contain single atomic integer

q)c:string b          / convert this integer atom to string “900”

q)c
"900"

q)`int $ c            / converting string to integer will return the
                      / ASCII equivalent of the character “9”, “0” and
                      / “0” to produce the list of integer 57, 48 and
                      / 48.
57 48 48i

q)6h $ c / Same as above 57 48 48i q)"i" $ c             / Same a above
57 48 48i

q)"I" $ c
900i

Jadi untuk mentransmisikan seluruh string (daftar karakter) ke satu atom tipe data x mengharuskan kami untuk menentukan huruf besar yang mewakili tipe data x sebagai argumen pertama untuk $operator. Jika Anda menentukan tipe datax dengan cara lain, hal itu mengakibatkan cast diterapkan ke setiap karakter string.

Itu q bahasa memiliki banyak cara berbeda untuk merepresentasikan dan memanipulasi data temporal seperti waktu dan tanggal.

Tanggal

Tanggal dalam kdb + disimpan secara internal sebagai bilangan bulat hari sejak tanggal referensi kami adalah 01Jan2000. Tanggal setelah tanggal ini disimpan secara internal sebagai angka positif dan tanggal sebelumnya yang direferensikan sebagai angka negatif.

Secara default, tanggal ditulis dalam format "YYYY.MM.DD"

q)x:2015.01.22      / This is how we write 22nd Jan 2015

q)`int$x / Number of days since 2000.01.01 5500i q)`year$x           / Extracting year from the date
2015i

q)x.year            / Another way of extracting year
2015i

q)`mm$x / Extracting month from the date 1i q)x.mm / Another way of extracting month 1i q)`dd$x             / Extracting day from the date
22i

q)x.dd              / Another way of extracting day
22i

Arithmetic and logical operations dapat dilakukan langsung pada tanggal.

q)x+1        / Add one day
2015.01.23

q)x-7        / Subtract 7 days
2015.01.15

Tanggal 1 Januari 2000 jatuh pada hari Sabtu. Oleh karena itu setiap hari Sabtu sepanjang sejarah atau di masa depan ketika dibagi 7, akan menghasilkan sisa 0, Minggu memberi 1, Senin menghasilkan 2.

Day               mod 7
           Saturday              0
           Sunday                1
           Monday                2
           Tuesday               3
           Wednesday             4
           Thursday              5
           Friday                6

Waktu

Waktu disimpan secara internal sebagai bilangan bulat milidetik sejak tanda tengah malam. Waktu ditulis dalam format HH: MM: SS.MSS

q)tt1: 03:30:00.000     / tt1 store the time 03:30 AM

q)tt1
03:30:00.000

q)`int$tt1 / Number of milliseconds in 3.5 hours 12600000i q)`hh$tt1               / Extract the hour component from time
3i

q)tt1.hh
3i

q)`mm$tt1 / Extract the minute component from time 30i q)tt1.mm 30i q)`ss$tt1               / Extract the second component from time
0i

q)tt1.ss
0i

Seperti halnya tanggal, aritmatika dapat dilakukan langsung pada waktu.

Waktu data

Datetime adalah kombinasi dari tanggal dan waktu, dipisahkan oleh 'T' seperti dalam format standar ISO. Nilai datetime menyimpan jumlah hari pecahan dari tengah malam 1 Jan 2000.

q)dt:2012.12.20T04:54:59:000      / 04:54.59 AM on 20thDec2012

q)type dt
-15h

q)dt
2012.12.20T04:54:59.000
9
q)`float$dt
4737.205

Penghitungan hari pecahan yang mendasari dapat diperoleh dengan casting ke float.

Daftar adalah blok bangunan dasar dari q language, jadi pemahaman yang menyeluruh tentang daftar sangat penting. Daftar hanyalah kumpulan atom yang teratur (unsur atom) dan daftar lain (kelompok satu atau lebih atom).

Jenis Daftar

SEBUAH general listmembungkus itemnya dalam tanda kurung yang cocok dan memisahkannya dengan titik koma. Misalnya -

(9;8;7)   or   ("a"; "b"; "c")   or   (-10.0; 3.1415e; `abcd; "r")

Jika suatu daftar terdiri dari atom-atom yang jenisnya sama, itu dikenal sebagai a uniform list. Lain, itu dikenal sebagaigeneral list (tipe campuran).

Menghitung

Kami dapat memperoleh jumlah item dalam daftar melalui hitungannya.

q)l1:(-10.0;3.1415e;`abcd;"r")    / Assigning variable name to general list

q)count l1                        / Calculating number of items in the list l1
4

Contoh Daftar sederhana

q)h:(1h;2h;255h)                    / Simple Integer List

q)h
1 2 255h

q)f:(123.4567;9876.543;98.7)        / Simple Floating Point List

q)f
123.4567 9876.543 98.7

q)b:(0b;1b;0b;1b;1b)                / Simple Binary Lists

q)b
01011b

q)symbols:(`Life;`Is;`Beautiful)    / Simple Symbols List

q)symbols
`Life`Is`Beautiful

q)chars:("h";"e";"l";"l";"o";" ";"w";"o";"r";"l";"d") 
                                    / Simple char lists and Strings.
q)chars
"hello world"

**Note − A simple list of char is called a string.

Daftar berisi atom atau daftar. To create a single item list, kami menggunakan -

q)singleton:enlist 42

q)singleton
,42

To distinguish between an atom and the equivalent singleton, periksa tanda tipenya.

q)signum type 42
-1i

q)signum type enlist 42
1i

Daftar diurutkan dari kiri ke kanan berdasarkan posisi itemnya. Offset item dari awal daftar disebut itsindex. Jadi, item pertama memiliki indeks 0, item kedua (jika ada) memiliki indeks 1, dll. Daftar hitungann memiliki domain indeks dari 0 untuk n–1.

Notasi Indeks

Diberikan daftar L, item di indeks i diakses oleh L[i]. Mengambil item dengan indeksnya disebutitem indexing. Sebagai contoh,

q)L:(99;98.7e;`b;`abc;"z")

q)L[0]
99

q)L[1]
98.7e

q)L[4]
"z

Tugas yang Diindeks

Item dalam daftar juga dapat ditetapkan melalui pengindeksan item. Jadi,

q)L1:9 8 7

q)L1[2]:66      / Indexed assignment into a simple list
                / enforces strict type matching.
                
q)L1
9 8 66

Daftar dari Variabel

q)l1:(9;8;40;200)

q)l2:(1 4 3; `abc`xyz)

q)l:(l1;l2)               / combining the two list l1 and l2

q)l
9 8 40 200
(1 4 3;`abc`xyz)

Daftar Bergabung

Operasi paling umum pada dua daftar adalah menggabungkan keduanya untuk membentuk daftar yang lebih besar. Lebih tepatnya, operator gabungan (,) menambahkan operan kanannya ke akhir operan kiri dan mengembalikan hasilnya. Ia menerima atom di salah satu argumen.

q)1,2 3 4
1 2 3 4

q)1 2 3, 4.4 5.6     / If the arguments are not of uniform type,
                     / the result is a general list.
1
2
3
4.4
5.6

Bersarang

Kompleksitas data dibangun dengan menggunakan daftar sebagai item dari daftar.

Kedalaman

Jumlah level bersarang untuk daftar disebut kedalamannya. Atom memiliki kedalaman 0 dan daftar sederhana memiliki kedalaman 1.

q)l1:(9;8;(99;88))

q)count l1
3

Berikut adalah daftar kedalaman 3 yang memiliki dua item -

q)l5
9
(90;180;900 1800 2700 3600)

q)count l5
2

q)count l5[1]
3

Mengindeks di Kedalaman

Dimungkinkan untuk mengindeks langsung ke item dari daftar bertingkat.

Repeated Item Indexing

Mengambil item melalui indeks tunggal selalu mengambil item paling atas dari daftar bertingkat.

q)L:(1;(100;200;(300;400;500;600)))

q)L[0]
1

q)L[1]
100
200
300 400 500 600

Sejak hasilnya L[1] itu sendiri adalah daftar, kita dapat mengambil elemennya menggunakan indeks tunggal.

q)L[1][2]
300 400 500 600

Kita dapat mengulangi pengindeksan tunggal sekali lagi untuk mengambil item dari daftar bersarang paling dalam.

q)L[1][2][0]
300

Anda dapat membaca ini sebagai,

Dapatkan item pada indeks 1 dari L, dan darinya mengambil item pada indeks 2, dan darinya mengambil item pada indeks 0.

Notation for Indexing at Depth

Ada notasi alternatif untuk pengindeksan berulang ke dalam konstituen daftar bersarang. Pengambilan terakhir juga dapat ditulis sebagai,

q)L[1;2;0]
300

Tugas melalui indeks juga bekerja secara mendalam.

q)L[1;2;1]:900

q)L
1
(100;200;300 900 500 600)

Indeks Terpilih

Eliding Indices for a General List

q)L:((1 2 3; 4 5 6 7); (`a`b`c;`d`e`f`g;`0`1`2);("good";"morning"))

q)L
(1 2 3;4 5 6 7)
(`a`b`c;`d`e`f`g;`0`1`2)
("good";"morning")

q)L[;1;]
4 5 6 7
`d`e`f`g
"morning"

q)L[;;2]
3 6
`c`f`2
"or"

Interpret L[;1;] as,

Ambil semua item di posisi kedua dari setiap daftar di tingkat teratas.

Interpret L[;;2] as,

Ambil item di posisi ketiga untuk setiap daftar di tingkat kedua.

Kamus adalah perpanjangan dari daftar yang memberikan dasar untuk membuat tabel. Dalam istilah matematika, kamus membuat

"Domain → Rentang"

atau secara umum (singkat) kreasi

"Kunci → nilai"

hubungan antar elemen.

Dictionary adalah kumpulan pasangan kunci-nilai yang secara kasar setara dengan tabel hash. Kamus adalah pemetaan yang ditentukan oleh asosiasi I / O eksplisit antara daftar domain dan daftar rentang melalui korespondensi posisi. Pembuatan kamus menggunakan primitif "xkey" (!)

ListOfDomain ! ListOfRange

Kamus paling dasar memetakan daftar sederhana menjadi daftar sederhana.

Masukan (I) Keluaran (O)
`Nama `John
`Umur 36
`Seks “M”
Bobot 60.3
q)d:`Name`Age`Sex`Weight!(`John;36;"M";60.3)   / Create a dictionary d

q)d

Name   | `John
Age    | 36
Sex    | "M"
Weight | 60.3

q)count d             / To get the number of rows in a dictionary.
4

q)key d               / The function key returns the domain
`Name`Age`Sex`Weight

q)value d             / The function value returns the range.

`John
36

"M"
60.3

q)cols d             / The function cols also returns the domain.
`Name`Age`Sex`Weight

Lihatlah

Menemukan nilai keluaran kamus yang sesuai dengan nilai masukan disebut looking up masukan.

q)d[`Name]       / Accessing the value of domain `Name
`John

q)d[`Name`Sex]   / extended item-wise to a simple list of keys
`John
"M"

Cari dengan Verb @

q)d1:`one`two`three!9 18 27

q)d1[`two]
18

q)d1@`two
18

Operasi di Kamus

Amandemen dan Upsert

Seperti halnya daftar, item kamus dapat dimodifikasi melalui tugas yang diindeks.

d:`Name`Age`Sex`Weight! (`John;36;"M";60.3)
                                  / A dictionary d
                                  
q)d[`Age]:35                      / Assigning new value to key Age

q)d 
                              / New value assigned to key Age in d
Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3

Kamus dapat diperpanjang melalui penugasan indeks.

q)d[`Height]:"182 Ft"

q)d

Name   | `John
Age    | 35
Sex    | "M"
Weight | 60.3
Height | "182 Ft"

Reverse Lookup dengan Find (?)

Operator find (?) Digunakan untuk melakukan pencarian terbalik dengan memetakan berbagai elemen ke elemen domainnya.

q)d2:`x`y`z!99 88 77

q)d2?77
`z

Jika elemen daftar tidak unik, maka find mengembalikan pemetaan item pertama ke dalamnya dari daftar domain.

Menghapus Entri

Untuk menghapus entri dari kamus, file delete ( _ ) functiondigunakan. Operan kiri (_) adalah kamus dan operan kanan adalah nilai kunci.

q)d2:`x`y`z!99 88 77

q)d2 _`z

x| 99
y| 88

Spasi kosong harus ada di sebelah kiri _ jika operan pertama adalah variabel.

q)`x`y _ d2           / Deleting multiple entries

z| 77

Kamus Kolom

Kamus kolom adalah dasar-dasar pembuatan tabel. Perhatikan contoh berikut -

q)scores: `name`id!(`John`Jenny`Jonathan;9 18 27)
                              / Dictionary scores
                              
q)scores[`name]               / The values for the name column are
`John`Jenny`Jonathan

q)scores.name                 / Retrieving the values for a column in a
                              / column dictionary using dot notation.
`John`Jenny`Jonathan

q)scores[`name][1]            / Values in row 1 of the name column
`Jenny

q)scores[`id][2]              / Values in row 2 of the id column is
27

Membalik Kamus

Efek bersih dari membalik kamus kolom hanyalah membalik urutan indeks. Ini secara logis setara dengan mengubah posisi baris dan kolom.

Buka Kamus Kolom

Transposisi kamus diperoleh dengan menerapkan operator flip unary. Lihat contoh berikut -

q)scores

name  | John Jenny Jonathan
id    | 9   18   27

q)flip scores

  name     id
---------------
  John     9
  Jenny    18
 Jonathan  27

Balik dari Kamus Kolom Terbalik

Jika Anda mengubah urutan kamus dua kali, Anda mendapatkan kamus aslinya,

q)scores ~ flip flip scores
1b

Tabel berada di jantung kdb +. Tabel adalah kumpulan kolom bernama yang diimplementasikan sebagai kamus.q tables berorientasi kolom.

Membuat Tabel

Tabel dibuat menggunakan sintaks berikut -

q)trade:([]time:();sym:();price:();size:())

q)trade
time sym price size
-------------------

Dalam contoh di atas, kami belum menentukan jenis setiap kolom. Ini akan diatur dengan sisipan pertama ke dalam tabel.

Cara lain, kita dapat menentukan jenis kolom saat inisialisasi -

q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())

Atau kita juga bisa mendefinisikan tabel yang tidak kosong -

q)trade:([]sym:(`a`b);price:(1 2))

q)trade

 sym   price
-------------
  a      1
  b      2

Jika tidak ada kolom dalam tanda kurung siku seperti pada contoh di atas, tabel tersebut adalah unkeyed.

Untuk membuat file keyed table, kami memasukkan kolom untuk kunci dalam tanda kurung siku.

q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())

q)trade

 sym   | time price size
-----  | ---------------

Seseorang juga dapat menentukan tipe kolom dengan mengatur nilainya menjadi daftar null dari berbagai tipe -

q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)

Mendapatkan Informasi Tabel

Mari buat meja perdagangan -

trade: ([]sym:`ibm`msft`apple`samsung;mcap:2000 4000 9000 6000;ex:`nasdaq`nasdaq`DAX`Dow)

q)cols trade                         / column names of a table
`sym`mcap`ex

q)trade.sym                          / Retrieves the value of column sym
`ibm`msft`apple`samsung

q)show meta trade                    / Get the meta data of a table trade.

  c   | t f a
----- | -----
 Sym  | s
 Mcap | j
 ex   | s

Kunci Utama dan Tabel Berwarna

Tabel Keyed

Tabel berkunci adalah kamus yang memetakan setiap baris dalam tabel kunci unik ke baris terkait dalam tabel nilai. Mari kita ambil contoh -

val:flip `name`id!(`John`Jenny`Jonathan;9 18 27)
                          / a flip dictionary create table val
id:flip (enlist `eid)!enlist 99 198 297
                          / flip dictionary, having single column eid

Sekarang buat tabel kunci sederhana yang berisi idul fitri sebagai kunci,

q)valid: id ! val

q)valid                 / table name valid, having key as eid

  eid |  name      id
---   | ---------------
  99  |  John      9
  198 |  Jenny     18
  297 |  Jonathan  27

ForeignKeys

SEBUAH foreign key mendefinisikan pemetaan dari baris-baris tabel di mana ia didefinisikan ke baris-baris tabel yang sesuai primary key.

Kunci asing menyediakan referential integrity. Dengan kata lain, upaya untuk memasukkan nilai kunci asing yang tidak ada di kunci utama akan gagal.

Perhatikan contoh berikut. Dalam contoh pertama, kami akan mendefinisikan kunci asing secara eksplisit pada inisialisasi. Dalam contoh kedua, kita akan menggunakan pengejaran kunci asing yang tidak mengasumsikan hubungan sebelumnya antara dua tabel.

Example 1 − Define foreign key on initialization

q)sector:([sym:`SAMSUNG`HSBC`JPMC`APPLE]ex:`N`CME`DAQ`N;MC:1000 2000 3000 4000)

q)tab:([]sym:`sector$`HSBC`APPLE`APPLE`APPLE`HSBC`JPMC;price:6?9f)

q)show meta tab

  c    | t f a
------ | ----------
 sym   | s sector
 price | f

q)show select from tab where sym.ex=`N

  sym     price
----------------
 APPLE   4.65382
 APPLE   4.643817
 APPLE   3.659978

Example 2 − no pre-defined relationship between tables

sector: ([symb:`IBM`MSFT`HSBC]ex:`N`CME`N;MC:1000 2000 3000)
tab:([]sym:`IBM`MSFT`MSFT`HSBC`HSBC;price:5?9f)

Untuk menggunakan pengejaran kunci asing, kita harus membuat tabel untuk memasukkan kunci ke dalam sektor.

q)show update mc:(sector([]symb:sym))[`MC] from tab

  sym     price      mc
--------------------------
  IBM   7.065297    1000
  MSFT  4.812387    2000
  MSFT  6.400545    2000
  HSBC  3.704373    3000
  HSBC  4.438651    3000

Notasi umum untuk kunci asing yang telah ditentukan -

pilih ab dari c di mana a adalah kunci asing (sym), b adalah a

bidang di tabel kunci primer (ind), c adalah

tabel kunci asing (perdagangan)

Memanipulasi Tabel

Mari buat satu meja perdagangan dan periksa hasil dari ekspresi tabel yang berbeda -

q)trade:([]sym:5?`ibm`msft`hsbc`samsung;price:5?(303.00*3+1);size:5?(900*5);time:5?(.z.T-365))

q)trade

  sym        price   size   time
-----------------------------------------
 msft      743.8592  3162  02:32:17.036
 msft      641.7307  2917  01:44:56.936
 hsbc      838.2311  1492  00:25:23.210
 samsung   278.3498  1983  00:29:38.945
 ibm       838.6471  4006  07:24:26.842

Sekarang mari kita lihat pernyataan yang digunakan untuk memanipulasi tabel menggunakan q bahasa.

Pilih

Sintaks untuk menggunakan a Select pernyataannya adalah sebagai berikut -

select [columns] [by columns] from table [where clause]

Sekarang mari kita ambil contoh untuk mendemonstrasikan bagaimana menggunakan pernyataan Select -

q)/ select expression example

q)select sym,price,size by time from trade where size > 2000

    time      |  sym    price     size
------------- | -----------------------
 01:44:56.936 |  msft   641.7307  2917
 02:32:17.036 |  msft   743.8592  3162
 07:24:26.842 |  ibm    838.6471  4006

Memasukkan

Sintaks untuk menggunakan file Insert pernyataannya adalah sebagai berikut -

`tablename insert (values)
Insert[`tablename; values]

Sekarang mari kita ambil contoh untuk menunjukkan bagaimana menggunakan pernyataan Sisipkan -

q)/ Insert expression example

q)`trade insert (`hsbc`apple;302.0 730.40;3020 3012;09:30:17.00409:15:00.000)
5 6

q)trade

   sym    price     size    time
------------------------------------------
  msft    743.8592  3162   02:32:17.036
  msft    641.7307  2917   01:44:56.936
  hsbc    838.2311  1492   00:25:23.210
 samsung  278.3498  1983   00:29:38.945
  ibm     838.6471  4006   07:24:26.842
  hsbc    302       3020   09:30:17.004
  apple   730.4     3012   09:15:00.000

q)/Insert another value

q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000]
']

q)insert[`trade;(`samsung;302.0; 3333;10:30:00.000)]
,7

q)trade

   sym     price   size     time
----------------------------------------
  msft   743.8592  3162  02:32:17.036
  msft   641.7307  2917  01:44:56.936
  hsbc   838.2311  1492  00:25:23.210
 samsung 278.3498  1983  00:29:38.945
  ibm    838.6471  4006  07:24:26.842
  hsbc   302       3020  09:30:17.004
  apple  730.4     3012  09:15:00.000
 samsung 302       3333  10:30:00.000

Menghapus

Sintaks untuk menggunakan a Delete pernyataannya adalah sebagai berikut -

delete columns from table
delete from table where clause

Sekarang mari kita ambil contoh untuk menunjukkan bagaimana menggunakan pernyataan Hapus -

q)/Delete expression example

q)delete price from trade

   sym   size       time
-------------------------------
  msft   3162   02:32:17.036
  msft   2917   01:44:56.936
  hsbc   1492   00:25:23.210
 samsung 1983   00:29:38.945
  ibm    4006   07:24:26.842
  hsbc   3020   09:30:17.004
  apple  3012   09:15:00.000
 samsung 3333   10:30:00.000

q)delete from trade where price > 3000

   sym     price     size       time
-------------------------------------------
  msft    743.8592   3162    02:32:17.036
  msft    641.7307   2917    01:44:56.936
  hsbc    838.2311   1492    00:25:23.210
 samsung  278.3498   1983    00:29:38.945
  ibm     838.6471   4006    07:24:26.842
  hsbc    302        3020    09:30:17.004
  apple   730.4      3012    09:15:00.000
 samsung  302        3333    10:30:00.000

q)delete from trade where price > 500

  sym     price     size     time
-----------------------------------------
 samsung  278.3498  1983  00:29:38.945
  hsbc    302       3020  09:30:17.004
 samsung  302       3333  10:30:00.000

Memperbarui

Sintaks untuk menggunakan file Update pernyataannya adalah sebagai berikut -

update column: newValue from table where ….

Gunakan sintaks berikut untuk memperbarui format / tipe data kolom menggunakan fungsi cast -

update column:newValue from `table where …

Sekarang mari kita ambil contoh untuk mendemonstrasikan cara menggunakan Update pernyataan -

q)/Update expression example

q)update size:9000 from trade where price > 600

  sym     price      size     time
------------------------------------------
  msft    743.8592   9000   02:32:17.036
  msft    641.7307   9000   01:44:56.936
  hsbc    838.2311   9000   00:25:23.210
 samsung  278.3498   1983   00:29:38.945
  ibm     838.6471   9000   07:24:26.842
  hsbc    302        3020   09:30:17.004
  apple   730.4      9000   09:15:00.000
 samsung  302        3333   10:30:00.000

q)/Update the datatype of a column using the cast function

q)meta trade

   c  |  t f a
----- | --------
  sym |  s
 price|  f
 size |  j
 time |  t

q)update size:`float$size from trade sym price size time ------------------------------------------ msft 743.8592 3162 02:32:17.036 msft 641.7307 2917 01:44:56.936 hsbc 838.2311 1492 00:25:23.210 samsung 278.3498 1983 00:29:38.945 ibm 838.6471 4006 07:24:26.842 hsbc 302 3020 09:30:17.004 apple 730.4 3012 09:15:00.000 samsung 302 3333 10:30:00.000 q)/ Above statement will not update the size column datatype permanently q)meta trade c | t f a ------ | -------- sym | s price | f size | j time | t q)/to make changes in the trade table permanently, we have do q)update size:`float$size from `trade
`trade

q)meta trade

   c   |  t f a
------ | --------
  sym  |   s
 price |   f
 size  |   f
 time  |   t

Kdb + memiliki kata benda, kata kerja, dan kata keterangan. Semua objek dan fungsi data adalahnouns. Verbs meningkatkan keterbacaan dengan mengurangi jumlah tanda kurung siku dan tanda kurung dalam ekspresi. Adverbsmemodifikasi fungsi dan kata kerja diadik (2 argumen) untuk menghasilkan kata kerja baru yang terkait. Fungsi yang dihasilkan oleh kata keterangan disebutderived functions atau derived verbs.

Setiap

Kata keterangan each, dilambangkan dengan (`), memodifikasi fungsi dan kata kerja diad untuk diterapkan ke item daftar alih-alih daftar itu sendiri. Lihat contoh berikut -

q)1, (2 3 5)       / Join
1 2 3 5

q)1, '( 2 3 4)     / Join each
1 2
1 3
1 4

Ada bentuk Eachuntuk fungsi monadik yang menggunakan kata kunci "masing-masing". Sebagai contoh,

q)reverse ( 1 2 3; "abc")           /Reverse
a b c
1 2 3

q)each [reverse] (1 2 3; "abc")     /Reverse-Each
3 2 1
c b a

q)'[reverse] ( 1 2 3; "abc")
3 2 1
c b a

Each-Left dan Each-Right

Ada dua varian Each untuk fungsi dyadic yang dipanggil Each-Left (\ :) dan Each-Right(/ :). Contoh berikut menjelaskan cara menggunakannya.

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each

9   10
18  20
27  30
36  40

q)x: 9 18 27 36

q)y:10 20 30 40

q)x,y            / join
9 18 27 36 10 20 30 40

q)x,'y           / each, will return a list of pairs

9   10
18  20
27  30
36  40

q)x, \:y         / each left, returns a list of each element
                 / from x with all of y
					  
9   10  20  30  40
18  10  20  30  40
27  10  20  30  40
36  10  20  30  40

q)x,/:y          / each right, returns a list of all the x with
                 / each element of y
					  
9  18  27  36  10
9  18  27  36  20
9  18  27  36  30
9  18  27  36  40

q)1 _x           / drop the first element
18 27 36

q)-2_y           / drop the last two element
10 20

q)               / Combine each left and each right to be a
                 / cross-product (cartesian product)
                 
q)x,/:\:y

9   10  9   20  9   30  9   40
18  10  18  20  18  30  18  40
27  10  27  20  27  30  27  40
36  10  36  20  36  30  36  40

Di qbahasa, kami memiliki berbagai jenis gabungan berdasarkan tabel input yang disediakan dan jenis tabel gabungan yang kami inginkan. Gabungan menggabungkan data dari dua tabel. Selain pengejaran kunci asing, ada empat cara lain untuk menggabungkan tabel -

  • Bergabung sederhana
  • Asof join
  • Gabung kiri
  • Serikat bergabung

Di sini, di bab ini, kita akan membahas masing-masing gabungan ini secara mendetail.

Bergabung Sederhana

Gabungan sederhana adalah jenis gabungan paling dasar, dilakukan dengan koma ','. Dalam hal ini, kedua tabel tersebut harustype conformant, yaitu, kedua tabel memiliki jumlah kolom yang sama dalam urutan yang sama, dan kunci yang sama.

table1,:table2 / table1 is assigned the value of table2

Kita dapat menggunakan koma-setiap gabungan untuk tabel dengan panjang yang sama untuk bergabung ke samping. Salah satu tabel dapat dikunci di sini,

Table1, `Table2

Asof Join (aj)

Ini adalah gabungan paling kuat yang digunakan untuk mendapatkan nilai bidang dalam satu tabel seperti waktu di tabel lain. Umumnya ini digunakan untuk mendapatkan bid dan ask yang berlaku pada saat setiap perdagangan.

Format umum

aj[joinColumns;tbl1;tbl2]

Sebagai contoh,

aj[`sym`time;trade;quote]

Contoh

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show aj[`a`b;tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Bergabung Kiri (lj)

Ini adalah kasus khusus aj dimana argumen kedua adalah tabel kunci dan argumen pertama berisi kolom dari kunci argumen yang benar.

Format umum

table1 lj Keyed-table

Contoh

q)/Left join- syntax table1 lj table2 or lj[table1;table2]

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([a:(2 3 4);b:(3 4 5)]; c:( 4 5 6))

q)show lj[tab1;tab2]

 a  b  d  c
-------------
 1  2  6
 2  3  7  4
 3  4  8  5
 4  5  9  6

Union Join (uj)

Ini memungkinkan untuk membuat gabungan dua tabel dengan skema berbeda. Ini pada dasarnya merupakan perpanjangan dari simple join (,)

q)tab1:([]a:(1 2 3 4);b:(2 3 4 5);d:(6 7 8 9))

q)tab2:([]a:(2 3 4);b:(3 4 5); c:( 4 5 6))

q)show uj[tab1;tab2]

 a  b  d  c
------------
 1  2  6
 2  3  7
 3  4  8
 4  5  9
 2  3     4
 3  4     5
 4  5     6

Jika Anda menggunakan uj pada tabel kunci, maka kunci primer harus cocok.

Jenis Fungsi

Fungsi dapat diklasifikasikan dalam beberapa cara. Di sini kami telah mengklasifikasikan mereka berdasarkan jumlah dan jenis argumen yang mereka ambil dan jenis hasil. Fungsinya bisa,

  • Atomic - Dimana argumennya atom dan menghasilkan hasil atom

  • Aggregate - atom dari daftar

  • Uniform (list from list)- Perluas konsep atom saat diterapkan pada daftar. Hitungan daftar argumen sama dengan hitungan daftar hasil.

  • Other - jika fungsinya bukan dari kategori di atas.

Operasi biner dalam matematika disebut dyadic functionsdi q; misalnya, “+”. Demikian pula, operasi unary disebutmonadic functions; misalnya, "abs" atau "floor".

Fungsi yang Sering Digunakan

Ada beberapa fungsi yang sering digunakan di qpemrograman. Di sini, di bagian ini, kita akan melihat penggunaan beberapa fungsi populer -

abs

q) abs -9.9 / Absolute value, Negates -ve number & leaves non -ve number
9.9

semua

q) all 4 5 0 -4 / Logical AND (numeric min), returns the minimum value
0b

Max (&), Min (|), dan Not (!)

q) /And, Or, and Logical Negation

q) 1b & 1b        / And (Max)
1b

q) 1b|0b              / Or (Min)
1b

q) not 1b             /Logical Negate (Not)
0b

asc

q)asc 1 3 5 7 -2 0 4    / Order list ascending, sorted list
                        / in ascending order i
s returned
`s#-2 0 1 3 4 5 7

q)/attr - gives the attributes of data, which describe how it's sorted.
`s denotes fully sorted, `u denotes unique and `p and `g are used to 
refer to lists with repetition, with `p standing for parted and `g for grouped

rata-rata

q)avg 3 4 5 6 7           / Return average of a list of numeric values
5f

q)/Create on trade table

q)trade:([]time:3?(.z.Z-200);sym:3?(`ibm`msft`apple);price:3?99.0;size:3?100)

oleh

q)/ by - Groups rows in a table at given sym

q)select sum price by sym from trade    / find total price for each sym

  sym  |   price
------ | --------
 apple | 140.2165
  ibm  | 16.11385

cols

q)cols trade / Lists columns of a table
`time`sym`price`size

menghitung

q)count (til 9) / Count list, count the elements in a list and
                / return a single int value 9

Pelabuhan

q)\p 9999 / assign port number

q)/csv - This command allows queries in a browser to be exported to
   excel by prefixing the query, such as http://localhost:9999/.csv?select from trade where sym =`ibm

memotong

q)/ cut - Allows a table or list to be cut at a certain point

q)(1 3 5) cut "abcdefghijkl"
                            / the argument is split at 1st, 3rd and 5th letter.
"bc"
"de"
"fghijkl"

q)5 cut "abcdefghijkl"      / cut the right arg. Into 5 letters part
                            / until its end.
"abcde"
"fghij"
"kl"

Menghapus

q)/delete - Delete rows/columns from a table

q)delete price from trade

          time              sym   size
---------------------------------------
  2009.06.18T06:04:42.919  apple   36
  2009.11.14T12:42:34.653   ibm    12
  2009.12.27T17:02:11.518  apple   97

Berbeda

q)/distinct - Returns the distinct element of a list

q)distinct 1 2 3 2 3 4 5 2 1 3            / generate unique set of number
1 2 3 4 5

mendapatkan

q)/enlist - Creates one-item list.

q)enlist 37
,37

q)type 37           / -ve type value
-7h

q)type enlist 37    / +ve type value
7h

Isi (^)

q)/fill - used with nulls. There are three functions for processing null values.

The dyadic function named fill replaces null values in the right argument with the atomic left argument.

q)100 ^ 3 4 0N 0N -5
3 4 100 100 -5

q)`Hello^`jack`herry``john`
`jack`herry`Hello`john`Hello

Mengisi

q)/fills - fills in nulls with the previous not null value.

q)fills 1 0N 2 0N 0N 2 3 0N -5 0N
1 1 2 2 2 2 3 3 -5 -5

Pertama

q)/first - returns the first atom of a list

q)first 1 3 34 5 3
1

Balik

q)/flip - Monadic primitive that applies to lists and associations. It interchange the top two levels of its argument.

q)trade

       time                   sym      price   size
------------------------------------------------------
  2009.06.18T06:04:42.919    apple   72.05742   36
  2009.11.14T12:42:34.653    ibm     16.11385   12
  2009.12.27T17:02:11.518    apple   68.15909   97

q)flip trade

time | 2009.06.18T06:04:42.919 2009.11.14T12:42:34.653
2009.12.27T17:02:11.518

sym   |  apple         ibm         apple
price | 72.05742     16.11385    68.15909
size  | 36 12 97

iasc

q)/iasc - Index ascending, return the indices of the ascended sorted list relative to the input list.

q)iasc 5 4 0 3 4 9

2 3 1 4 0 5

Idesc

q)/idesc - Index desceding, return the descended sorted list relative to the input list

q)idesc 0 1 3 4

3 2 1 0

di

q)/in - In a list, dyadic function used to query list (on the right-handside) about their contents.

q)(2 4) in 1 2 3

10b

memasukkan

q)/insert - Insert statement, upload new data into a table.

q)insert[`trade;((.z.Z);`samsung;48.35;99)],3

q)trade

      time                  sym       price     size
------------------------------------------------------
 2009.06.18T06:04:42.919   apple    72.05742     36
 2009.11.14T12:42:34.653    ibm     16.11385     12
 2009.12.27T17:02:11.518   apple    68.15909     97
 2015.04.06T10:03:36.738   samsung  48.35        99

kunci

q)/key - three different functions i.e. generate +ve integer number, gives content of a directory or key of a table/dictionary.

q)key 9

0 1 2 3 4 5 6 7 8

q)key `:c:
`$RECYCLE.BIN`Config.Msi`Documents and Settings`Drivers`Geojit`hiberfil.sys`I..

menurunkan

q)/lower - Convert to lower case and floor

q)lower ("JoHn";`HERRY`SYM)
"john"
`herry`sym

Max dan Min (yaitu | dan &)

q)/Max and Min / a|b and a&b

q)9|7
9

q)9&5
5

batal

q)/null - return 1b if the atom is a null else 0b from the argument list

q)null 1 3 3 0N
0001b

Persik

q)/peach - Parallel each, allows process across slaves

q)foo peach list1       / function foo applied across the slaves named in list1

'list1

q)foo:{x+27}

q)list1:(0 1 2 3 4)

q)foo peach list1       / function foo applied across the slaves named in list1
27 28 29 30 31

Sebelumnya

q)/prev - returns the previous element i.e. pushes list forwards

q)prev 0 1 3 4 5 7

0N 0 1 3 4 5

Acak (?)

q)/random - syntax - n?list, gives random sequences of ints and floats

q)9?5
0 0 4 0 3 2 2 0 1

q)3?9.9
0.2426823 1.674133 3.901671

Meruntuhkan

q)/raze - Flattn a list of lists, removes a layer of indexing from a list of lists. for instance:

q)raze (( 12 3 4; 30 0);("hello";7 8); 1 3 4)

12 3 4
30 0
"hello"
7 8
1
3
4

baca0

q)/read0 - Read in a text file

q)read0 `:c:/q/README.txt    / gives the contents of *.txt file

baca1

q)/read1 - Read in a q data file

q)read1 `:c:/q/t1

0xff016200630b000500000073796d0074696d6500707269636…

balik

q)/reverse - Reverse a list

q)reverse 2 30 29 1 3 4

4 3 1 29 30 2

q)reverse "HelloWorld"

"dlroWolleH"

set

q)/set - set value of a variable

q)`x set 9
`x

q)x
9

q)`:c:/q/test12 set trade

`:c:/q/test12

q)get `:c:/q/test12

       time                   sym      price     size
---------------------------------------------------------
  2009.06.18T06:04:42.919    apple    72.05742    36
  2009.11.14T12:42:34.653     ibm     16.11385    12
  2009.12.27T17:02:11.518    apple    68.15909    97
  2015.04.06T10:03:36.738    samsung  48.35       99
  2015.04.06T10:03:47.540    samsung  48.35       99
  2015.04.06T10:04:44.844    samsung  48.35       99

ssr

q)/ssr - String search and replace, syntax - ssr["string";searchstring;replaced-with]

q)ssr["HelloWorld";"o";"O"]

"HellOWOrld"

tali

q)/string - converts to string, converts all types to a string format.

q)string (1 2 3; `abc;"XYZ";0b)

(,"1";,"2";,"3")
"abc"

(,"X";,"Y";,"Z")
,"0"

SV

q)/sv - Scalar from vector, performs different tasks dependent on its arguments.

It evaluates the base representation of numbers, which allows us to calculate the number of seconds in a month or convert a length from feet and inches to centimeters.

q)24 60 60 sv 11 30 49

41449   / number of seconds elapsed in a day at 11:30:49

sistem

q)/system - allows a system command to be sent,

q)system "dir *.py"

" Volume in drive C is New Volume"
" Volume Serial Number is 8CD2-05B2"
""

" Directory of C:\\Users\\myaccount-raj"
""

"09/14/2014    06:32 PM     22 hello1.py"
"                1 File(s)    22 bytes"

tabel

q)/tables - list all tables

q)tables `

`s#`tab1`tab2`trade

Til

q)/til - Enumerate

q)til 5

0 1 2 3 4

memangkas

q)/trim - Eliminate string spaces

q)trim " John "

"John"

vs.

q)/vs - Vector from scaler , produces a vector quantity from a scaler quantity

q)"|" vs "20150204|msft|20.45"

"20150204"
"msft"
"20.45"

xasc

q)/xasc - Order table ascending, allows a table (right-hand argument) to be sorted such that (left-hand argument) is in ascending order

q)`price xasc trade

          time                 sym      price      size
----------------------------------------------------------
   2009.11.14T12:42:34.653     ibm     16.11385     12
   2015.04.06T10:03:36.738   samsung   48.35        99
   2015.04.06T10:03:47.540   samsung   48.35        99
   2015.04.06T10:04:44.844   samsung   48.35        99
   2009.12.27T17:02:11.518    apple    68.15909     97
   2009.06.18T06:04:42.919    apple    72.05742     36

xcol

q)/xcol - Renames columns of a table

q)`timeNew`symNew xcol trade

        timeNew                 symNew    price      size
-------------------------------------------------------------
   2009.06.18T06:04:42.919      apple    72.05742     36
   2009.11.14T12:42:34.653       ibm     16.11385     12
   2009.12.27T17:02:11.518      apple    68.15909     97
   2015.04.06T10:03:36.738     samsung   48.35        99
   2015.04.06T10:03:47.540     samsung   48.35        99
   2015.04.06T10:04:44.844     samsung   48.35        99

xcols

q)/xcols - Reorders the columns of a table,

q)`size`price xcols trade

  size    price           time                   sym
-----------------------------------------------------------
   36   72.05742   2009.06.18T06:04:42.919      apple 
   12   16.11385   2009.11.14T12:42:34.653       ibm
   97   68.15909   2009.12.27T17:02:11.518      apple
   99   48.35      2015.04.06T10:03:36.738     samsung 
   99   48.35      2015.04.06T10:03:47.540     samsung
   99   48.35      2015.04.06T10:04:44.844     samsung

xdesc

q)/xdesc - Order table descending, allows tables to be sorted such that the left-hand argument is in descending order.

q)`price xdesc trade

        time                   sym       price      size
-----------------------------------------------------------
   2009.06.18T06:04:42.919    apple    72.05742      36
   2009.12.27T17:02:11.518    apple    68.15909      97
   2015.04.06T10:03:36.738   samsung   48.35         99
   2015.04.06T10:03:47.540   samsung   48.35         99
   2015.04.06T10:04:44.844   samsung   48.35         99
   2009.11.14T12:42:34.653     ibm     16.11385      12

xgroup

q)/xgroup - Creates nested table

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40)
'length

q)`x xgroup ([]x:9 18 9 18 27 9 9;y:10 20 10 20 30 40 10)

  x  |    y
---- | -----------
  9  | 10 10 40 10
  18 | 20 20
  27 | ,30

xkey

q)/xkey - Set key on table

q)`sym xkey trade

    sym   |      time                    price     size
--------- | -----------------------------------------------
   apple  | 2009.06.18T06:04:42.919    72.05742     36
    ibm   | 2009.11.14T12:42:34.653    16.11385     12
   apple  | 2009.12.27T17:02:11.518    68.15909     97
  samsung | 2015.04.06T10:03:36.738    48.35        99
  samsung | 2015.04.06T10:03:47.540    48.35        99
  samsung | 2015.04.06T10:04:44.844    48.35        99

Perintah Sistem

Perintah sistem mengontrol qlingkungan Hidup. Mereka adalah dari bentuk berikut -

\cmd [p]       where p may be optional

Beberapa dari perintah sistem yang populer telah dibahas di bawah ini -

\ a [namespace] - Buat daftar tabel di namespace yang diberikan

q)/Tables in default namespace

q)\a
,`trade

q)\a .o         / table in .o namespace.
,`TI

\ b - Melihat dependensi

q)/ views/dependencies

q)a:: x+y      / global assingment

q)b:: x+1

q)\b
`s#`a`b

\ B - Tampilan / ketergantungan menunggu keputusan

q)/ Pending views/dependencies

q)a::x+1     / a depends on x

q)\B         / the dependency is pending
' / the dependency is pending

q)\B
`s#`a`b

q)\b
`s#`a`b

q)b
29

q)a
29

q)\B
`symbol$()

\ cd - Ubah direktori

q)/change directory, \cd [name]

q)\cd
"C:\\Users\\myaccount-raj"

q)\cd ../new-account

q)\cd
"C:\\Users\\new-account"

\ d - menyetel namespace saat ini

q)/ sets current namespace \d [namespace]

q)\d             /default namespace
'

q)\d .o          /change to .o

q.o)\d
`.o

q.o)\d .         / return to default

q)key `          /lists namespaces other than .z
`q`Q`h`j`o

q)\d .john       /change to non-existent namespace

q.john)\d
`.john

q.john)\d .

q)\d
`.

\ l - memuat file atau direktori dari db

q)/ Load file or directory, \l

q)\l test2.q / loading test2.q which is stored in current path.

   ric      |     date      ex      openP    closeP    MCap
----------- | -------------------------------------------------
 JPMORGAN   | 2008.05.23  SENSEX  18.30185  17.16319  17876
   HSBC     | 2002.05.21  NIFTY   2.696749  16.58846  26559
 JPMORGAN   | 2006.09.07  NIFTY   14.15219  20.05624  14557
   HSBC     | 2010.10.11  SENSEX  7.394497  25.45859  29366
 JPMORGAN   | 2007.10.02  SENSEX  1.558085  25.61478  20390
 
   ric     |    date       ex      openP     closeP    MCap
---------- | ------------------------------------------------
  INFOSYS  | 2003.10.30    DOW    21.2342   7.565652   2375
 RELIANCE  | 2004.08.12    DOW    12.34132  17.68381   4201
   SBIN    | 2008.02.14    DOW    1.830857  9.006485   15465
  INFOSYS  | 2009.06.11  HENSENG  19.47664  12.05208   11143
   SBIN    | 2010.07.05    DOW    18.55637  10.54082   15873

\ p - nomor porta

q)/ assign port number, \p

q)\p
5001i

q)\p 8888

q)\p
8888i

\\ - Keluar dari konsol q

\\ - exit
Exit form q.

Itu qbahasa pemrograman memiliki serangkaian fungsi built-in yang kaya dan kuat. Fungsi bawaan dapat dari jenis berikut -

  • String function - Mengambil string sebagai input dan mengembalikan string.

  • Aggregate function - Mengambil daftar sebagai masukan dan mengembalikan atom.

  • Uniform function - Mengambil daftar dan mengembalikan daftar hitungan yang sama.

  • Mathematical function - Mengambil argumen numerik dan mengembalikan argumen numerik.

  • Miscellaneous function - Semua fungsi selain yang disebutkan di atas.

Fungsi String

Seperti - pencocokan pola

q)/like is a dyadic, performs pattern matching, return 1b on success else 0b

q)"John" like "J??n"
1b

q)"John My Name" like "J*"
1b

ltrim - menghilangkan awalan kosong

q)/ ltrim - monadic ltrim takes string argument, removes leading blanks

q)ltrim " Rick "
"Rick "

rtrim - menghapus jejak kosong

q)/rtrim - takes string argument, returns the result of removing trailing blanks

q)rtrim " Rick "
" Rick"

ss - pencarian string

q)/ss - string search, perform pattern matching, same as "like" but return the indices of the matches of the pattern in source.

q)"Life is beautiful" ss "i"
1 5 13

trim - menghilangkan bagian depan dan belakang yang kosong

q)/trim - takes string argument, returns the result of removing leading & trailing blanks

q)trim " John "
"John"

Fungsi Matematika

acos - kebalikan dari cos

q)/acos - inverse of cos, for input between -1 and 1, return float between 0 and pi

q)acos 1
0f

q)acos -1
3.141593

q)acos 0
1.570796

cor - memberi korelasi

q)/cor - the dyadic takes two numeric lists of same count, returns a correlation between the items of the two arguments

q)27 18 18 9 0 cor 27 36 45 54 63
-0.9707253

silang - produk Cartesian

q)/cross - takes atoms or lists as arguments and returns their Cartesian product

q)9 18 cross `x`y`z

9 `x
9 `y
9 `z

18 `x
18 `y
18 `z

var - varians

q)/var - monadic, takes a scaler or numeric list and returns a float equal to the mathematical variance of the items

q)var 45
0f

q)var 9 18 27 36
101.25

wavg

q)/wavg - dyadic, takes two numeric lists of the same count and returns the average of the second argument weighted by the first argument.

q)1 2 3 4 wavg 200 300 400 500
400f

Fungsi Agregat

semua - & operasi

q)/all - monadic, takes a scaler or list of numeric type and returns the result of & applied across the items.

q)all 0b
0b

q)all 9 18 27 36
1b

q)all 10 20 30
1b

Apa saja - | operasi

q)/any - monadic, takes scaler or list of numeric type and the return the result of | applied across the items

q)any 20 30 40 50
1b

q)any 20012.02.12 2013.03.11
'20012.02.12

prd - produk aritmatika

q)/prd - monadic, takes scaler, list, dictionary or table of numeric type and returns the arithmetic product.

q)prd `x`y`z! 10 20 30
6000

q)prd ((1 2; 3 4);(10 20; 30 40))

10 40
90 160

Jumlah - jumlah aritmatika

q)/sum - monadic, takes a scaler, list,dictionary or table of numeric type and returns the arithmetic sum.

q)sum 2 3 4 5 6
20

q)sum (1 2; 4 5)
5 7

Fungsi Seragam

Delta - perbedaan dari item sebelumnya.

q)/deltas -takes a scalar, list, dictionary or table and returns the difference of each item from its predecessor.

q)deltas 2 3 5 7 9
2 1 2 2 2

q)deltas `x`y`z!9 18 27

x | 9
y | 9
z | 9

mengisi - mengisi nilai nulls

q)/fills - takes scalar, list, dictionary or table of numeric type and returns a c copy of the source in which non-null items are propagated forward to fill nulls

q)fills 1 0N 2 0N 4
1 1 2 2 4

q)fills `a`b`c`d! 10 0N 30 0N

a | 10
b | 10
c | 30
d | 30

maks - maksimum kumulatif

q)/maxs - takes scalar, list, dictionary or table and returns the cumulative maximum of the source items.

q)maxs 1 2 4 3 9 13 2
1 2 4 4 9 13 13

q)maxs `a`b`c`d!9 18 0 36

a | 9
b | 18
c | 18
d | 36

Fungsi Miscellaneous

Hitung - jumlah kembali elemen

q)/count - returns the number of entities in its argument.

q)count 10 30 30
3

q)count (til 9)
9

q)count ([]a:9 18 27;b:1.1 2.2 3.3)
3

Berbeda - mengembalikan entitas yang berbeda

q)/distinct - monadic, returns the distinct entities in its argument

q)distinct 1 2 3 4 2 3 4 5 6 9
1 2 3 4 5 6 9

Kecuali - elemen tidak ada di argumen kedua.

q)/except - takes a simple list (target) as its first argument and returns a list containing the items of target that are not in its second argument

q)1 2 3 4 3 1 except 1
2 3 4 3

fill - isi null dengan argumen pertama

q)/fill (^) - takes an atom as its first argument and a list(target) as its second argument and return a list obtained by substituting the first argument for every occurrence of null in target

q)42^ 9 18 0N 27 0N 36
9 18 42 27 42 36

q)";"^"Life is Beautiful"
"Life;is;Beautiful"

Kueri dalam qlebih pendek dan sederhana dan memperluas kemampuan sql. Ekspresi kueri utama adalah 'ekspresi pilihan', yang dalam bentuk paling sederhana mengekstrak sub-tabel tetapi juga dapat membuat kolom baru.

Bentuk umum a Select expression adalah sebagai berikut -

Select columns by columns from table where conditions

**Note − by & where frase adalah opsional, hanya 'dari ekspresi' yang wajib.

Secara umum, sintaksisnya adalah -

select [a] [by b] from t [where c]
update [a] [by b] from t [where c]

Sintaks dari q ekspresi terlihat sangat mirip dengan SQL, tetapi qekspresi sederhana dan kuat. Ekspresi sql yang setara untuk yang di atasq ekspresi akan menjadi sebagai berikut -

select [b] [a] from t [where c] [group by b order by b]
update t set [a] [where c]

Semua klausa dijalankan pada kolom dan karenanya qbisa memanfaatkan ketertiban. Karena kueri Sql tidak didasarkan pada pesanan, mereka tidak dapat memanfaatkannya.

qQuery relasional biasanya berukuran jauh lebih kecil dibandingkan dengan sql yang sesuai. Kueri yang teratur dan fungsional melakukan hal-hal yang sulit di sql.

Dalam database historis, urutan file whereklausa sangat penting karena mempengaruhi kinerja kueri. Itupartition variabel (tanggal / bulan / hari) selalu datang pertama diikuti oleh kolom yang diurutkan dan diindeks (umumnya kolom sym).

Sebagai contoh,

select from table where date in d, sym in s

jauh lebih cepat daripada,

select from table where sym in s, date in d

Kueri Dasar

Mari menulis skrip kueri di notepad (seperti di bawah ini), simpan (sebagai * .q), dan kemudian muat.

sym:asc`AIG`CITI`CSCO`IBM`MSFT;
ex:"NASDAQ"
dst:`$":c:/q/test/data/"; /database destination @[dst;`sym;:;sym]; n:1000000; trade:([]sym:n?`sym;time:10:30:00.0+til n;price:n?3.3e;size:n?9;ex:n?ex); quote:([]sym:n?`sym;time:10:30:00.0+til n;bid:n?3.3e;ask:n?3.3e;bsize:n?9;asize:n?9;ex:n?ex); {@[;`sym;`p#]`sym xasc x}each`trade`quote; d:2014.08.07 2014.08.08 2014.08.09 2014.08.10 2014.08.11; /Date vector can also be changed by the user dt:{[d;t].[dst;(`$string d;t;`);:;value t]};
d dt/:\:`trade`quote;

Note: Once you run this query, two folders .i.e. "test" and "data" will be created under "c:/q/", and date partition data can be seen inside data folder.

Kueri dengan Batasan

* Denotes HDB query

Select all IBM trades

select from trade where sym in `IBM

*Select all IBM trades on a certain day

thisday: 2014.08.11
select from trade where date=thisday,sym=`IBM

Select all IBM trades with a price > 100

select from trade where sym=`IBM, price > 100.0

Select all IBM trades with a price less than or equal to 100

select from trade where sym=`IBM,not price > 100.0

*Select all IBM trades between 10.30 and 10.40, in the morning, on a certain date

thisday: 2014.08.11
select from trade where
date = thisday, sym = `IBM, time > 10:30:00.000,time < 10:40:00.000

Select all IBM trades in ascending order of price

`price xasc select from trade where sym =`IBM

*Select all IBM trades in descending order of price in a certain time frame

`price xdesc select from trade where date within 2014.08.07 2014.08.11, sym =`IBM

Composite sort − sort ascending order by sym and then sort the result in descending order of price

`sym xasc `price xdesc select from trade where date = 2014.08.07,size = 5

Select all IBM or MSFT trades

select from trade where sym in `IBM`MSFT

*Calculate count of all symbols in ascending order within a certain time frame

`numsym xasc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

*Calculate count of all symbols in descending order within a certain time frame

`numsym xdesc select numsym: count i by sym from trade where date within 2014.08.07 2014.08.11

* What is the maximum price of IBM stock within a certain time frame, and when does this first happen?

select time,ask from quote where date within 2014.08.07 2014.08.11,
sym =`IBM, ask = exec first ask from select max ask from quote where
sym =`IBM

Select the last price for each sym in hourly buckets

select last price by hour:time.hh, sym from trade

Kueri dengan Agregasi

* Calculate vwap (Volume Weighted Average Price) of all symbols

select vwap:size wavg price by sym from trade

* Count the number of records (in millions) for a certain month

(select trade:1e-6*count i by date.dd from trade where date.month=2014.08m) + select quote:1e-6*count i by date.dd from quote where date.month=2014.08m

* HLOC – Daily High, Low, Open and Close for CSCO in a certain month

select high:max price,low:min price,open:first price,close:last price by date.dd from trade where date.month=2014.08m,sym =`CSCO

* Daily Vwap for CSCO in a certain month

select vwap:size wavg price by date.dd from trade where date.month = 2014.08m ,sym = `CSCO

* Calculate the hourly mean, variance and standard deviation of the price for AIG

select mean:avg price, variance:var price, stdDev:dev price by date, hour:time.hh from trade where sym = `AIG

Select the price range in hourly buckets

select range:max[price] – min price by date,sym,hour:time.hh from trade

* Daily Spread (average bid-ask) for CSCO in a certain month

select spread:avg bid-ask by date.dd from quote where date.month = 2014.08m, sym = `CSCO

* Daily Traded Values for all syms in a certain month

select dtv:sum size by date,sym from trade where date.month = 2014.08m

Extract a 5 minute vwap for CSCO

select size wavg price by 5 xbar time.minute from trade where sym = `CSCO

* Extract 10 minute bars for CSCO

select high:max price,low:min price,close:last price by date, 10 xbar time.minute from trade where sym = `CSCO

* Find the times when the price exceeds 100 basis points (100e-4) over the last price for CSCO for a certain day

select time from trade where date = 2014.08.11,sym = `CSCO,price > 1.01*last price

* Full Day Price and Volume for MSFT in 1 Minute Intervals for the last date in the database

select last price,last size by time.minute from trade where date = last date, sym = `MSFT

KDB + memungkinkan satu proses untuk berkomunikasi dengan proses lain melalui komunikasi antarproses. Proses Kdb + dapat terhubung ke kdb + lainnya di komputer yang sama, jaringan yang sama, atau bahkan dari jarak jauh. Kami hanya perlu menentukan port dan kemudian klien dapat berbicara ke port itu. Apa sajaq proses dapat berkomunikasi dengan yang lain q proses selama dapat diakses di jaringan dan mendengarkan koneksi.

  • proses server mendengarkan koneksi dan memproses permintaan apa pun

  • proses klien memulai koneksi dan mengirimkan perintah untuk dieksekusi

Klien dan server dapat berada di mesin yang sama atau di mesin yang berbeda. Suatu proses dapat berupa klien dan server.

Suatu komunikasi dapat berupa,

  • Synchronous (tunggu hasil dikembalikan)

  • Asynchronous (tidak menunggu dan tidak ada hasil yang dikembalikan)

Inisialisasi Server

SEBUAH q server diinisialisasi dengan menentukan port yang akan didengarkan,

q –p 5001 / command line
\p 5001   / session command

Menangani Komunikasi

Pegangan komunikasi adalah simbol yang dimulai dengan ":" dan memiliki bentuk -

`:[server]:port-number

Contoh

`::5001              / server and client on same machine
`:jack:5001          / server on machine jack
`:192.168.0.156      / server on specific IP address
`:www.myfx.com:5001  / server at www.myfx.com

Untuk memulai koneksi, kami menggunakan fungsi "hopen" yang mengembalikan pegangan koneksi integer. Tuas ini digunakan untuk semua permintaan klien berikutnya. Misalnya -

q)h:hopen `::5001

q)h"til 5"
0 1 2 3 4

q)hclose h

Pesan Sinkron dan Asinkron

Setelah kami memiliki pegangan, kami dapat mengirim pesan baik secara sinkron maupun asinkron.

Synchronous Message- Setelah pesan terkirim, ia menunggu dan mengembalikan hasilnya. Formatnya adalah sebagai berikut -

handle “message”

Asynchronous Message- Setelah mengirim pesan, segera mulai memproses pernyataan berikutnya tanpa harus menunggu dan mengembalikan hasil. Formatnya adalah sebagai berikut -

neg[handle] “message”

Pesan yang memerlukan respons, misalnya panggilan fungsi atau pernyataan pilih, biasanya akan menggunakan bentuk sinkron; sedangkan pesan yang tidak perlu mengembalikan output, misalnya memasukkan update ke tabel, akan menjadi asynchronous.

Ketika sebuah q Proses terhubung ke yang lain qproses melalui komunikasi antar proses, diproses oleh penangan pesan. Penangan pesan ini memiliki perilaku default. Misalnya, dalam kasus penanganan pesan sinkron, penangan mengembalikan nilai kueri. Penangan sinkron dalam kasus ini adalah.z.pg, yang dapat kami ganti sesuai kebutuhan.

Proses Kdb + memiliki beberapa penangan pesan yang telah ditentukan sebelumnya. Penangan pesan penting untuk mengkonfigurasi database. Beberapa penggunaan termasuk -

  • Logging - Catat pesan masuk (berguna jika terjadi kesalahan fatal),

  • Security- Izinkan / larang akses ke database, panggilan fungsi tertentu, dll., Berdasarkan nama pengguna / alamat ip. Ini membantu dalam memberikan akses ke pelanggan resmi saja.

  • Handle connections/disconnections dari proses lain.

Penangan Pesan Standar

Beberapa penangan pesan standar dibahas di bawah ini.

.z.pg

Ini adalah penangan pesan sinkron (proses get). Fungsi ini dipanggil secara otomatis setiap kali pesan sinkronisasi diterima pada instance kdb +.

Parameter adalah panggilan string / fungsi yang akan dijalankan, yaitu pesan yang dilewatkan. Secara default, ini didefinisikan sebagai berikut -

.z.pg: {value x}                / simply execute the message 
                                received but we can overwrite it to
give any customized result.
.z.pg : {handle::.z.w;value x}  / this will store the remote handle
.z.pg : {show .z.w;value x}     / this will show the remote handle

.z.ps

Ini adalah penangan pesan asinkron (kumpulan proses). Ini adalah penangan yang setara untuk pesan asinkron. Parameter adalah panggilan string / fungsi yang akan dijalankan. Secara default, ini didefinisikan sebagai,

.z.pg : {value x}        / Can be overriden for a customized action.

Berikut adalah penanganan pesan yang disesuaikan untuk pesan asinkron, di mana kami telah menggunakan eksekusi yang dilindungi,

.z.pg: {@[value; x; errhandler x]}

Sini errhandler adalah fungsi yang digunakan jika terjadi kesalahan yang tidak terduga.

.z.po []

Ini adalah handler terbuka koneksi (proses terbuka). Ini dijalankan ketika proses jarak jauh membuka koneksi. Untuk melihat pegangan ketika koneksi ke proses dibuka, kita dapat mendefinisikan .z.po sebagai,

.z.po : {Show “Connection opened by” , string h: .z.h}

.z.pc []

Ini adalah penangan koneksi dekat (proses-tutup). Ini dipanggil ketika koneksi ditutup. Kita dapat membuat penangan dekat kita sendiri yang dapat mengatur ulang pegangan koneksi global ke 0 dan mengeluarkan perintah untuk mengatur pengatur waktu agar menyala (dieksekusi) setiap 3 detik (3000 milidetik).

.z.pc : { h::0; value “\\t 3000”}

Pengatur waktu (.z.ts) mencoba membuka kembali koneksi. Jika berhasil, pengatur waktu akan mati.

.z.ts : { h:: hopen `::5001; if [h>0; value “\\t 0”] }

.z.pi []

PI adalah singkatan dari proses input. Ini disebut untuk segala jenis masukan. Ini dapat digunakan untuk menangani input konsol atau input klien jarak jauh. Menggunakan .z.pi [], seseorang dapat memvalidasi input konsol atau mengganti tampilan default. Selain itu, ini dapat digunakan untuk segala jenis operasi logging.

q).z.pi
'.z.pi

q).z.pi:{">", .Q.s value x}

q)5+4
>9

q)30+42
>72

q)30*2
>60

q)\x .z.pi
>q)

q)5+4
9

.z.pw

Ini adalah pengendali koneksi validasi (otentikasi pengguna). Ia menambahkan callback ekstra saat koneksi dibuka ke sesi kdb +. Ini dipanggil setelah pemeriksaan –u / -U dan sebelum .z.po (port open).

.z.pw : {[user_id;passwd] 1b}

Masukan adalah userid (simbol) dan password (teks).

Daftar, kamus, atau kolom tabel dapat memiliki atribut yang diterapkan padanya. Atribut memaksakan properti tertentu pada daftar. Beberapa atribut mungkin hilang saat modifikasi.

Jenis Atribut

Diurutkan (`s #)

`s # berarti daftar diurutkan dalam urutan menaik. Jika daftar secara eksplisit diurutkan berdasarkan asc (atau xasc), daftar secara otomatis akan memiliki set atribut yang diurutkan.

q)L1: asc 40 30 20 50 9 4

q)L1
`s#4 9 20 30 40 50

Daftar yang diketahui diurutkan juga dapat memiliki atribut yang disetel secara eksplisit. Q akan memeriksa apakah daftar tersebut diurutkan, dan jika tidak, sebuah s-fail kesalahan akan terlempar.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Atribut yang diurutkan akan hilang setelah penambahan yang tidak diurutkan.

Berpisah (`p #)

`p # berarti daftar berpisah dan item identik disimpan berdekatan.

Rentangnya adalah int atau temporal type memiliki nilai int yang mendasari, seperti tahun, bulan, hari, dll. Anda juga dapat mempartisi simbol asalkan dicacah.

Menerapkan atribut parted membuat kamus indeks yang memetakan setiap nilai output unik ke posisi kejadian pertama. Ketika daftar dipisahkan, pencarian jauh lebih cepat, karena pencarian linier digantikan oleh pencarian hashtable.

q)L:`p# 99 88 77 1 2 3

q)L
`p#99 88 77 1 2 3

q)L,:3

q)L
99 88 77 1 2 3 3

Note −

  • Atribut parted tidak dipertahankan di bawah operasi pada daftar, bahkan jika operasi mempertahankan partisi.

  • Atribut parted harus dipertimbangkan ketika jumlah entitas mencapai satu miliar dan sebagian besar partisi berukuran besar, yaitu ada pengulangan yang signifikan.

Dikelompokkan (`g #)

`g # berarti daftar dikelompokkan. Kamus internal dibuat dan dipelihara yang memetakan setiap item unik ke setiap indeksnya, membutuhkan ruang penyimpanan yang cukup besar. Untuk daftar panjangnyaL mengandung u ukuran barang unik s, ini akan menjadi (L × 4) + (u × s) byte.

Pengelompokan dapat diterapkan ke daftar jika tidak ada asumsi lain tentang strukturnya yang dapat dibuat.

Atribut dapat diterapkan ke semua daftar yang diketik. Itu dipertahankan saat ditambahkan, tetapi hilang saat dihapus.

q)L: `g# 1 2 3 4 5 4 2 3 1 4 5 6

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6

q)L,:9

q)L
`g#1 2 3 4 5 4 2 3 1 4 5 6 9

q)L _:2

q)L
1 2 4 5 4 2 3 1 4 5 6 9

Unik (`#u)

Menerapkan atribut unik (`u #) ke daftar menunjukkan bahwa item dari daftar itu berbeda. Mengetahui bahwa elemen-elemen dari sebuah daftar itu unik secara dramatis semakin cepatdistinct dan memungkinkan q untuk melakukan beberapa perbandingan lebih awal.

Saat daftar ditandai sebagai unik, peta hash internal dibuat untuk setiap item dalam daftar. Operasi pada daftar harus mempertahankan keunikan atau atributnya hilang.

q)LU:`u#`MSFT`SAMSUNG`APPLE

q)LU
`u#`MSFT`SAMSUNG`APPLE

q)LU,:`IBM                        /Uniqueness preserved

q)LU
`u#`MSFT`SAMSUNG`APPLE`IBM

q)LU,:`SAMSUNG                    / Attribute lost

q)LU
`MSFT`SAMSUNG`APPLE`IBM`SAMSUNG

Note −

  • `u # dipertahankan pada rangkaian yang menjaga keunikan. Itu hilang karena penghapusan dan penggabungan non-unik.

  • Pencarian pada daftar `u # dilakukan melalui fungsi hash.

Menghapus Atribut

Atribut dapat dihapus dengan menerapkan `#.

Menerapkan Atribut

Tiga format untuk menerapkan atribut adalah -

  • L: `s# 14 2 3 3 9/ Tentukan selama pembuatan daftar

  • @[ `.; `L ; `s#]/ Fungsional berlaku, yaitu ke daftar variabel L

    / di namespace default (yaitu `.) berlaku

    / atribut yang diurutkan `s #

  • Update `s#time from `tab

    / Perbarui tabel (tab) untuk menerapkan

    / atribut.

Mari terapkan tiga format berbeda di atas dengan contoh.

q)/ set the attribute during creation

q)L:`s# 3 4 9 10 23 84 90

q)/apply the attribute to existing list data

q)L1: 9 18 27 36 42 54

q)@[`.;`L1;`s#]
`.

q)L1                 / check
`s#9 18 27 36 42 54

q)@[`.;`L1;`#]       / clear attribute
`.

q)L1
9 18 27 36 42 54

q)/update a table to apply the attribute

q)t: ([] sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t:([]time:09:00 09:30 10:00t;sym:`ibm`msft`samsung; mcap:9000 18000 27000)

q)t

    time         sym    mcap
---------------------------------
  09:00:00.000   ibm    9000
  09:30:00.000   msft   18000
  10:00:00.000  samsung 27000

q)update `s#time from `t
`t

q)meta t               / check it was applied

    c  | t f a
------ | -----
  time | t s
  sym  | s
  mcap | j
  
Above we can see that the attribute column in meta table results shows the time column is sorted (`s#).

Kueri fungsional (Dinamis) memungkinkan menentukan nama kolom sebagai simbol untuk kolom pilih / exec / delete q-sql yang khas. Ini sangat berguna ketika kita ingin menentukan nama kolom secara dinamis.

Bentuk fungsionalnya adalah -

?[t;c;b;a]    / for select
![t;c;b;a]    / for update

dimana

  • t adalah meja;

  • a adalah kamus agregat;

  • bfrase demi frase; dan

  • c adalah daftar kendala.

Catatan -

  • Semua q entitas di a, b, dan c harus direferensikan dengan nama, artinya sebagai simbol yang berisi nama entitas.

  • Bentuk sintaksis dari pilih dan pembaruan diurai menjadi bentuk fungsional yang setara oleh q penerjemah, jadi tidak ada perbedaan kinerja antara kedua bentuk.

Pemilihan fungsional

Blok kode berikut menunjukkan cara menggunakan functional select -

q)t:([]n:`ibm`msft`samsung`apple;p:40 38 45 54)

q)t

    n       p
-------------------
   ibm     40
   msft    38
 samsung   45
  apple    54

q)select m:max p,s:sum p by name:n from t where p>36, n in `ibm`msft`apple

  name |   m   s
------ | ---------
 apple |  54  54
 ibm   |  40  40
 msft  |  38  38

Contoh 1

Mari kita mulai dengan kasus termudah, versi fungsional “select from t” akan terlihat seperti -

q)?[t;();0b;()]     / select from t

    n      p
-----------------
   ibm    40
   msft   38
 samsung  45
  apple   54

Contoh 2

Dalam contoh berikut, kami menggunakan fungsi enlist untuk membuat lajang guna memastikan bahwa entitas yang sesuai adalah list.

q)wherecon: enlist (>;`p;40)

q)?[`t;wherecon;0b;()] / select from t where p > 40

    n      p
----------------
 samsung  45
  apple   54

Contoh 3

q)groupby: enlist[`p] ! enlist `p

q)selcols: enlist [`n]!enlist `n

q)?[ `t;(); groupby;selcols]        / select n by p from t

   p  |    n
----- | -------
  38  |  msft
  40  |  ibm
  45  | samsung
  54  | apple

Eksekutif Fungsional

Bentuk fungsional dari exec adalah bentuk yang disederhanakan dari select.

q)?[t;();();`n]                / exec n from t (functional form of exec)
`ibm`msft`samsung`apple

q)?[t;();`n;`p]                / exec p by n from t (functional exec)

apple   | 54
ibm     | 40
msft    | 38
samsung | 45

Pembaruan Fungsional

Bentuk fungsional pembaruan sangat mirip dengan select. Dalam contoh berikut, penggunaan enlist adalah untuk membuat lajang, untuk memastikan bahwa entitas input adalah daftar.

q)c:enlist (>;`p;0)

q)b: (enlist `n)!enlist `n

q)a: (enlist `p) ! enlist (max;`p)

q)![t;c;b;a]

   n      p
-------------
  ibm    40
  msft   38
 samsung 45
 apple   54

Hapus fungsional

Penghapusan fungsional adalah bentuk pembaruan fungsional yang disederhanakan. Sintaksnya adalah sebagai berikut -

![t;c;0b;a]        / t is a table, c is a list of where constraints, a is a
                   / list of column names

Sekarang mari kita ambil contoh untuk menunjukkan cara kerja penghapusan fungsional -

q)![t; enlist (=;`p; 40); 0b;`symbol$()]
                                          / delete from t where p = 40
   n       p
---------------
  msft    38
 samsung  45
  apple   54

Dalam bab ini, kita akan belajar bagaimana mengoperasikan kamus dan kemudian tabel. Mari kita mulai dengan kamus -

q)d:`u`v`x`y`z! 9 18 27 36 45                  / Creating a dictionary d

q)/ key of this dictionary (d) is given by

q)key d
`u`v`x`y`z

q)/and the value by

q)value d
9 18 27 36 45

q)/a specific value

q)d`x
27

q)d[`x]
27

q)/values can be manipulated by using the arithmetic operator +-*% as,

q)45 + d[`x`y]
72 81

Jika seseorang perlu mengubah nilai kamus, maka formulasi perubahan dapat menjadi -

q)@[`d;`z;*;9]
`d

q)d

u | 9
v | 18
x | 27
y | 36

q)/Example, table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

z | 405

q)/Example table tab

q)tab:([]sym:`;time:0#0nt;price:0n;size:0N)

q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT

q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)] 0 1 2 3 4 5 6 7 8 9 q)`time xasc `tab `tab q)/ to get particular column from table tab q)tab[`size] 12 10 1 90 73 90 43 90 84 63 q)tab[`size]+9 21 19 10 99 82 99 52 99 93 72 q)/Example table tab q)tab:([]sym:`;time:0#0nt;price:0n;size:0N) q)n:10;sym:`IBM`SAMSUNG`APPLE`MSFT q)insert[`tab;(n?sym;("t"$.z.Z);n?100.0;n?100)]
0 1 2 3 4 5 6 7 8 9

q)`time xasc `tab
`tab

q)/ to get particular column from table tab

q)tab[`size]
12 10 1 90 73 90 43 90 84 63

q)tab[`size]+9
21 19 10 99 82 99 52 99 93 72

q)/We can also use the @ amend too

q)@[tab;`price;-;2]

   sym      time           price     size
--------------------------------------------
  APPLE   11:16:39.779   6.388858     12
  MSFT    11:16:39.779   17.59907     10
  IBM     11:16:39.779   35.5638      1
 SAMSUNG  11:16:39.779   59.37452     90
  APPLE   11:16:39.779   50.94808     73
 SAMSUNG  11:16:39.779   67.16099     90
  APPLE   11:16:39.779   20.96615     43
 SAMSUNG  11:16:39.779   67.19531     90
  IBM     11:16:39.779   45.07883     84
  IBM     11:16:39.779   61.46716     63

q)/if the table is keyed

q)tab1:`sym xkey tab[0 1 2 3 4]

q)tab1

   sym    |   time          price     size
--------- | ----------------------------------
  APPLE   | 11:16:39.779   8.388858    12
  MSFT    | 11:16:39.779   19.59907    10
  IBM     | 11:16:39.779   37.5638     1
 SAMSUNG  | 11:16:39.779   61.37452    90
  APPLE   | 11:16:39.779   52.94808    73

q)/To work on specific column, try this

q){tab1[x]`size} each sym
1 90 12 10

q)(0!tab1)`size
12 10 1 90 73

q)/once we got unkeyed table, manipulation is easy

q)2+ (0!tab1)`size
14 12 3 92 75

Data pada hard disk Anda (juga disebut database historis) dapat disimpan dalam tiga format berbeda - File Datar, Tabel Tersebar, dan Tabel yang Dipartisi. Di sini kita akan belajar bagaimana menggunakan ketiga format tersebut untuk menyimpan data.

File datar

File datar dimuat sepenuhnya ke dalam memori, itulah sebabnya ukurannya (jejak memori) harus kecil. Tabel disimpan di disk seluruhnya dalam satu file (jadi ukuran penting).

Fungsi yang digunakan untuk memanipulasi tabel ini adalah set/get -

`:path_to_file/filename set tablename

Mari kita ambil contoh untuk mendemonstrasikan cara kerjanya -

q)tables `.
`s#`t`tab`tab1 

q)`:c:/q/w32/tab1_test set tab1
`:c:/q/w32/tab1_test

Di lingkungan Windows, file datar disimpan di lokasi - C:\q\w32

Dapatkan file flat dari disk Anda (db historis) dan gunakan get perintah sebagai berikut -

q)tab2: get `:c:/q/w32/tab1_test

q)tab2

   sym    |   time           price   size
--------- | -------------------------------
  APPLE   | 11:16:39.779   8.388858   12
  MSFT    | 11:16:39.779   19.59907   10
  IBM     | 11:16:39.779   37.5638    1
 SAMSUNG  | 11:16:39.779   61.37452   90
  APPLE   | 11:16:39.779   52.94808   73

Tabel baru dibuat tab2 dengan isinya disimpan di tab1_test mengajukan.

Tabel Splayed

Jika ada terlalu banyak kolom dalam sebuah tabel, maka kami menyimpan tabel tersebut dalam format yang terhampar, yaitu, kami menyimpannya pada disk dalam sebuah direktori. Di dalam direktori, setiap kolom disimpan dalam file terpisah dengan nama yang sama dengan nama kolom. Setiap kolom disimpan sebagai daftar jenis yang sesuai dalam file biner kdb +.

Menyimpan tabel dalam format terentang sangat berguna ketika kita harus mengakses hanya beberapa kolom dari banyak kolomnya. Direktori tabel yang membentang berisi.d file biner yang berisi urutan kolom.

Sama seperti file datar, tabel dapat disimpan sebagai terhampar dengan menggunakan setperintah. Untuk menyimpan tabel seperti yang terhampar, jalur file harus diakhiri dengan backlash -

`:path_to_filename/filename/ set tablename

Untuk membaca tabel yang terhampar, kita dapat menggunakan get fungsi -

tablename: get `:path_to_file/filename

Note - Untuk tabel yang akan disimpan sebagai terhampar, itu harus tidak dikunci dan dihitung.

Di lingkungan Windows, struktur file Anda akan muncul sebagai berikut -

Tabel yang Dipartisi

Tabel yang dipartisi menyediakan cara yang efisien untuk mengelola tabel besar yang berisi volume data yang signifikan. Tabel yang dipartisi adalah tabel yang tersebar di lebih banyak partisi (direktori).

Di dalam setiap partisi, sebuah tabel akan memiliki direktorinya sendiri, dengan struktur tabel yang terhampar. Tabel dapat dibagi berdasarkan hari / bulan / tahun untuk memberikan akses yang dioptimalkan ke kontennya.

Untuk mendapatkan konten tabel yang dipartisi, gunakan blok kode berikut -

q)get `:c:/q/data/2000.01.13              // “get” command used, sample folder

quote| +`sym`time`bid`ask`bsize`asize`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0
0 0 0….

trade| +`sym`time`price`size`ex!(`p#`sym!0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 ….

Mari kita coba untuk mendapatkan isi dari trade table -

q)get `:c:/q/data/2000.01.13/trade

   sym    time            price     size    ex
--------------------------------------------------
    0   09:30:00.496    0.4092016    7      T
    0   09:30:00.501    1.428629     4      N
    0   09:30:00.707    0.5647834    6      T
    0   09:30:00.781    1.590509     5      T
    0   09:30:00.848    2.242627     3      A
    0   09:30:00.860    2.277041     8      T
    0   09:30:00.931    0.8044885    8      A
    0   09:30:01.197    1.344031     2      A
    0   09:30:01.337    1.875        3      A
    0   09:30:01.399    2.187723     7      A

Note - Mode terpartisi cocok untuk tabel dengan jutaan catatan per hari (yaitu data deret waktu)

File Sym

File sym adalah file biner kdb + yang berisi daftar simbol dari semua tabel yang ditampilkan dan dipartisi. Itu bisa dibaca dengan,

get `:sym

file par.txt (opsional)

Ini adalah file konfigurasi, digunakan ketika partisi tersebar di beberapa direktori / drive disk, dan berisi jalur ke partisi disk.

.Q.en

.Q.enadalah fungsi dyadic yang membantu dalam melebarkan tabel dengan menghitung kolom simbol. Ini sangat berguna ketika kita berurusan dengan db historis (terhampar, tabel partisi, dll.). -

.Q.en[`:directory;table]

dimana directory adalah direktori home dari database historis tempat sym file terletak dan table adalah tabel yang akan dihitung.

Pencacahan tabel secara manual tidak diperlukan untuk menyimpannya sebagai tabel yang terhampar, karena ini akan dilakukan oleh -

.Q.en[`:directory_where_symbol_file_stored]table_name

.Q.dpft

Itu .Q.dpftfungsi membantu dalam membuat tabel yang dipartisi dan tersegmentasi. Ini adalah bentuk lanjutan dari.Q.en, karena tidak hanya memisahkan tabel tetapi juga membuat tabel partisi.

Ada empat argumen yang digunakan dalam .Q.dpft -

  • file simbolik menangani database tempat kita ingin membuat partisi,

  • q nilai data yang akan kita gunakan untuk mempartisi tabel,

  • nama bidang yang atribut parted (`p #) akan diterapkan (biasanya` sym), dan

  • nama tabel.

Mari kita ambil contoh untuk melihat cara kerjanya -

q)tab:([]sym:5?`msft`hsbc`samsung`ibm;time:5?(09:30:30);price:5?30.25)

q).Q.dpft[`:c:/q/;2014.08.24;`sym;`tab]
`tab

q)delete tab from `
'type

q)delete tab from `/
'type

q)delete tab from .
'type

q)delete tab from `.
`.

q)tab
'tab

Kami telah menghapus tabel tersebut tabdari memori. Sekarang mari kita memuatnya dari db

q)\l c:/q/2014.08.24/

q)\a
,`tab

q)tab

   sym      time      price
-------------------------------
  hsbc    07:38:13   15.64201
  hsbc    07:21:05   5.387037
  msft    06:16:58   11.88076
  msft    08:09:26   12.30159
 samsung  04:57:56   15.60838

.Q.chk

.Q.chk adalah fungsi monadik yang parameter tunggalnya adalah pegangan file simbolik dari direktori root. Ini membuat tabel kosong di partisi, di mana pun diperlukan, dengan memeriksa setiap subdirektori partisi di root.

.Q.chk `:directory

dimana directory adalah direktori utama dari database historis.