KDB + - คู่มือฉบับย่อ
นี่เป็นข้อสรุปที่สมบูรณ์ kdb+จากระบบ kx โดยมุ่งเป้าไปที่การเรียนรู้ด้วยตนเองเป็นหลัก kdb + เปิดตัวในปี พ.ศ. 2546 เป็นฐานข้อมูล kdb รุ่นใหม่ซึ่งออกแบบมาเพื่อจับวิเคราะห์เปรียบเทียบและจัดเก็บข้อมูล
ระบบ kdb + ประกอบด้วยสององค์ประกอบต่อไปนี้ -
KDB+ - ฐานข้อมูล (k ฐานข้อมูลบวก)
Q - ภาษาโปรแกรมสำหรับทำงานกับ kdb +
ทั้งสอง kdb+ และ q เขียนเป็น k programming language (เหมือนกับ q แต่อ่านได้น้อยกว่า)
พื้นหลัง
Kdb + / q มีต้นกำเนิดมาจากภาษาวิชาการที่คลุมเครือ แต่ในช่วงหลายปีที่ผ่านมามีการปรับปรุงความเป็นมิตรกับผู้ใช้อย่างค่อยเป็นค่อยไป
APL (พ.ศ. 2507 ภาษาเขียนโปรแกรม)
A+ (1988, APL แก้ไขโดย Arthur Whitney)
K (ปี 1993 A + รุ่นที่คมชัดพัฒนาโดย A. Whitney)
Kdb (1998, ฐานข้อมูลแบบคอลัมน์ในหน่วยความจำ)
Kdb+/q (2003, ภาษา q - รุ่นที่อ่านได้มากขึ้นของ k)
เหตุใดจึงควรใช้ KDB +
ทำไม? - หากคุณต้องการโซลูชันเดียวสำหรับข้อมูลเรียลไทม์ที่มีการวิเคราะห์คุณควรพิจารณา kdb + Kdb + จัดเก็บฐานข้อมูลเป็นไฟล์เนทีฟทั่วไปดังนั้นจึงไม่มีความต้องการพิเศษใด ๆ เกี่ยวกับฮาร์ดแวร์และสถาปัตยกรรมการจัดเก็บข้อมูล ควรชี้ให้เห็นว่าฐานข้อมูลเป็นเพียงชุดไฟล์ดังนั้นงานด้านการดูแลระบบของคุณจะไม่ยาก
จะใช้ KDB + ได้ที่ไหน?- ง่ายต่อการนับว่าวาณิชธนกิจใดไม่ได้ใช้ kdb + เนื่องจากส่วนใหญ่ใช้อยู่ในปัจจุบันหรือวางแผนที่จะเปลี่ยนจากฐานข้อมูลทั่วไปเป็น kdb + เนื่องจากปริมาณข้อมูลเพิ่มขึ้นในแต่ละวันเราจึงต้องการระบบที่สามารถรองรับข้อมูลจำนวนมหาศาลได้ KDB + ตอบสนองความต้องการนี้ KDB + ไม่เพียง แต่เก็บข้อมูลจำนวนมหาศาล แต่ยังวิเคราะห์ข้อมูลแบบเรียลไทม์อีกด้วย
เริ่มต้นใช้งาน
ด้วยความเป็นมามากมายตอนนี้ให้เรากำหนดและเรียนรู้วิธีตั้งค่าสภาพแวดล้อมสำหรับ KDB + เราจะเริ่มต้นด้วยวิธีดาวน์โหลดและติดตั้ง KDB +
การดาวน์โหลดและติดตั้ง KDB +
คุณสามารถรับ KDB + เวอร์ชัน 32 บิตฟรีพร้อมฟังก์ชันทั้งหมดของเวอร์ชัน 64 บิตได้จาก http://kx.com/software-download.php
ยอมรับข้อตกลงสิทธิ์การใช้งานเลือกระบบปฏิบัติการ (มีให้สำหรับระบบปฏิบัติการหลักทั้งหมด) สำหรับระบบปฏิบัติการ Windows เวอร์ชันล่าสุดคือ 3.2 ดาวน์โหลดเวอร์ชันล่าสุด เมื่อคุณเปิดเครื่องรูดแล้วคุณจะได้รับชื่อโฟลเดอร์“windows” และภายในโฟลเดอร์ windows คุณจะได้รับโฟลเดอร์อื่น “q”. คัดลอกทั้งหมดq โฟลเดอร์ลงใน c: / drive ของคุณ
เปิดเทอร์มินัล Run พิมพ์ตำแหน่งที่คุณจัดเก็บไฟล์ qโฟลเดอร์; มันจะเป็นเหมือน“ c: /q/w32/q.exe” เมื่อคุณกด Enter คุณจะได้รับคอนโซลใหม่ดังนี้ -
ในบรรทัดแรกคุณจะเห็นหมายเลขเวอร์ชันซึ่งก็คือ 3.2 และวันที่เผยแพร่เป็น 2015.03.05
เค้าโครงไดเรกทอรี
โดยทั่วไปแล้วรุ่นทดลอง / ฟรีจะติดตั้งในไดเรกทอรี
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 −
เมื่อคุณดาวน์โหลด kdb + โครงสร้างไดเร็กทอรีในแพลตฟอร์ม Windows จะปรากฏดังนี้ -
ในโครงสร้างไดเร็กทอรีด้านบน trade.q และ sp.q คือไฟล์ตัวอย่างที่เราใช้เป็นจุดอ้างอิงได้
Kdb + เป็นฐานข้อมูลที่มีประสิทธิภาพสูงและมีปริมาณมากซึ่งออกแบบมาตั้งแต่เริ่มแรกเพื่อจัดการกับข้อมูลจำนวนมหาศาล เป็น 64 บิตเต็มรูปแบบและมีการประมวลผลแบบมัลติคอร์และมัลติเธรดในตัว สถาปัตยกรรมเดียวกันนี้ใช้สำหรับข้อมูลเรียลไทม์และข้อมูลในอดีต ฐานข้อมูลประกอบด้วยภาษาแบบสอบถามที่มีประสิทธิภาพของตัวเองq, ดังนั้นการวิเคราะห์จึงสามารถรันบนข้อมูลได้โดยตรง
kdb+tick เป็นสถาปัตยกรรมที่ช่วยให้สามารถจับประมวลผลและสืบค้นข้อมูลแบบเรียลไทม์และในอดีต
Kdb + / ติ๊กสถาปัตยกรรม
ภาพประกอบต่อไปนี้แสดงโครงร่างทั่วไปของสถาปัตยกรรม Kdb + / tick ทั่วไปตามด้วยคำอธิบายสั้น ๆ เกี่ยวกับส่วนประกอบต่างๆและการไหลผ่านของข้อมูล
Data Feeds เป็นข้อมูลอนุกรมเวลาที่ส่วนใหญ่ให้บริการโดยผู้ให้บริการฟีดข้อมูลเช่นรอยเตอร์บลูมเบิร์กหรือโดยตรงจากการแลกเปลี่ยน
ในการรับข้อมูลที่เกี่ยวข้องข้อมูลจากฟีดข้อมูลจะถูกแยกวิเคราะห์โดยไฟล์ feed handler.
เมื่อข้อมูลถูกแยกวิเคราะห์โดยตัวจัดการฟีดข้อมูลจะไปที่ไฟล์ ticker-plant.
ในการกู้คืนข้อมูลจากความล้มเหลวใด ๆ ทิกเกอร์ - แพลนท์จะอัปเดต / จัดเก็บข้อมูลใหม่ลงในล็อกไฟล์จากนั้นอัปเดตตารางของตนเอง
หลังจากอัปเดตตารางภายในและไฟล์บันทึกข้อมูลลูปตรงเวลาจะถูกส่ง / เผยแพร่ไปยังฐานข้อมูลแบบเรียลไทม์อย่างต่อเนื่องและสมาชิกที่ถูกล่ามโซ่ทั้งหมดที่ร้องขอข้อมูล
เมื่อสิ้นสุดวันทำการไฟล์บันทึกจะถูกลบไฟล์ใหม่ที่สร้างขึ้นและฐานข้อมูลแบบเรียลไทม์จะถูกบันทึกลงในฐานข้อมูลประวัติ เมื่อข้อมูลทั้งหมดถูกบันทึกลงในฐานข้อมูลประวัติฐานข้อมูลแบบเรียลไทม์จะล้างตาราง
ส่วนประกอบของ Kdb + Tick Architecture
ฟีดข้อมูล
ฟีดข้อมูลอาจเป็นข้อมูลตลาดหรือข้อมูลอนุกรมเวลาอื่น ๆ พิจารณาฟีดข้อมูลเป็นอินพุตดิบของตัวจัดการฟีด ฟีดได้โดยตรงจากการแลกเปลี่ยน (ข้อมูลสตรีมสด) จากผู้ให้บริการข่าว / ข้อมูลเช่น Thomson-Reuters, Bloomberg หรือหน่วยงานภายนอกอื่น ๆ
ตัวจัดการฟีด
ตัวจัดการฟีดจะแปลงสตรีมข้อมูลให้อยู่ในรูปแบบที่เหมาะสมสำหรับการเขียนลงใน kdb + เชื่อมต่อกับฟีดข้อมูลและดึงและแปลงข้อมูลจากรูปแบบเฉพาะฟีดเป็นข้อความ Kdb + ซึ่งเผยแพร่ไปยังกระบวนการทิกเกอร์ - แพลนท์ โดยทั่วไปจะใช้ตัวจัดการฟีดเพื่อดำเนินการดังต่อไปนี้ -
- เก็บข้อมูลตามชุดของกฎ
- แปล (/ enrich) ข้อมูลนั้นจากรูปแบบหนึ่งไปยังอีกรูปแบบหนึ่ง
- จับค่าล่าสุด
โรงงานทิกเกอร์
Ticker Plant เป็นส่วนประกอบที่สำคัญที่สุดของสถาปัตยกรรม KDB + เป็นโรงงานสัญลักษณ์ที่มีการเชื่อมต่อฐานข้อมูลแบบเรียลไทม์หรือสมาชิกโดยตรง (ไคลเอนต์) เพื่อเข้าถึงข้อมูลทางการเงิน มันทำงานในpublish and subscribeกลไก. เมื่อคุณได้รับการสมัครสมาชิก (ใบอนุญาต) จะมีการกำหนดเครื่องหมายติ๊ก (เป็นประจำ) สิ่งพิมพ์จากผู้จัดพิมพ์ (โรงงานสัญลักษณ์) ดำเนินการดังต่อไปนี้ -
รับข้อมูลจากตัวจัดการฟีด
ทันทีหลังจากโรงงานทิกเกอร์ได้รับข้อมูลจะจัดเก็บสำเนาเป็นไฟล์บันทึกและอัปเดตเมื่อโรงงานสัญลักษณ์ได้รับการอัปเดตดังนั้นในกรณีที่เกิดความล้มเหลวเราไม่ควรมีข้อมูลสูญหาย
ลูกค้า (ผู้สมัครสมาชิกแบบเรียลไทม์) สามารถสมัครสมาชิกกับโรงงานที่เป็นสัญลักษณ์ได้โดยตรง
ในตอนท้ายของแต่ละวันทำการกล่าวคือเมื่อฐานข้อมูลเรียลไทม์ได้รับข้อความสุดท้ายจะจัดเก็บข้อมูลทั้งหมดของวันนี้ไว้ในฐานข้อมูลประวัติและส่งข้อมูลเดียวกันนี้ไปยังสมาชิกทั้งหมดที่สมัครรับข้อมูลวันนี้ จากนั้นจะรีเซ็ตตารางทั้งหมด นอกจากนี้ไฟล์บันทึกจะถูกลบเมื่อข้อมูลถูกเก็บไว้ในฐานข้อมูลประวัติหรือสมาชิกที่เชื่อมโยงโดยตรงกับฐานข้อมูลเรียลไทม์ (rtdb)
ด้วยเหตุนี้จึงทำให้ฐานข้อมูลแบบเรียลไทม์และฐานข้อมูลในอดีตสามารถทำงานได้ตลอด 24 ชั่วโมงทุกวัน
เนื่องจาก Ticker-plant เป็นแอปพลิเคชัน Kdb + จึงสามารถสอบถามตารางได้โดยใช้ qเช่นเดียวกับฐานข้อมูล Kdb + อื่น ๆ ลูกค้าที่เป็น บริษัท ขายตั๋วทั้งหมดควรเข้าถึงฐานข้อมูลในฐานะสมาชิกเท่านั้น
ฐานข้อมูลแบบเรียลไทม์
ฐานข้อมูลแบบเรียลไทม์ (rdb) เก็บข้อมูลของวันนี้ เชื่อมต่อโดยตรงกับโรงงานผลิตสัญลักษณ์ โดยปกติแล้วจะถูกเก็บไว้ในหน่วยความจำในช่วงเวลาทำการของตลาด (หนึ่งวัน) และเขียนลงในฐานข้อมูลประวัติ (hdb) ในตอนท้ายของวัน เนื่องจากข้อมูล (ข้อมูล rdb) ถูกเก็บไว้ในหน่วยความจำการประมวลผลจึงรวดเร็วมาก
เนื่องจาก kdb + แนะนำให้มีขนาด RAM ที่มากกว่าขนาดข้อมูลที่คาดไว้สี่เท่าต่อวันแบบสอบถามที่ทำงานบน rdb จึงเร็วมากและให้ประสิทธิภาพที่เหนือกว่า เนื่องจากฐานข้อมูลแบบเรียลไทม์มีเฉพาะข้อมูลของวันนี้จึงไม่จำเป็นต้องใช้คอลัมน์วันที่ (พารามิเตอร์)
ตัวอย่างเช่นเราสามารถมีแบบสอบถาม rdb เช่น
select from trade where sym = `ibm
OR
select from trade where sym = `ibm, price > 100
ฐานข้อมูลประวัติศาสตร์
หากเราต้องคำนวณค่าประมาณของ บริษัท เราจำเป็นต้องมีข้อมูลประวัติของ บริษัท ฐานข้อมูลย้อนหลัง (hdb) เก็บข้อมูลธุรกรรมที่ทำในอดีต บันทึกของแต่ละวันใหม่จะถูกเพิ่มลงใน hdb ในตอนท้ายของวัน ตารางขนาดใหญ่ใน hdb จะถูกจัดเก็บแบบแยกส่วน (แต่ละคอลัมน์จะถูกเก็บไว้ในไฟล์ของตัวเอง) หรือจะถูกจัดเก็บแบ่งพาร์ติชันโดยข้อมูลชั่วคราว นอกจากนี้ฐานข้อมูลขนาดใหญ่บางส่วนอาจถูกแบ่งพาร์ติชันเพิ่มเติมโดยใช้par.txt (ไฟล์).
กลยุทธ์การจัดเก็บข้อมูลเหล่านี้ (แยกส่วนแบ่งพาร์ติชัน ฯลฯ ) มีประสิทธิภาพในขณะค้นหาหรือเข้าถึงข้อมูลจากตารางขนาดใหญ่
นอกจากนี้ยังสามารถใช้ฐานข้อมูลประวัติเพื่อวัตถุประสงค์ในการรายงานภายในและภายนอกเช่นสำหรับการวิเคราะห์ ตัวอย่างเช่นสมมติว่าเราต้องการรับ บริษัท การค้าของ IBM ในวันใดวันหนึ่งจากชื่อตารางการค้า (หรือใด ๆ ) เราจำเป็นต้องเขียนแบบสอบถามดังนี้ -
thisday: 2014.10.12
select from trade where date = thisday, sym =`ibm
Note - เราจะเขียนข้อความค้นหาดังกล่าวทั้งหมดเมื่อเราได้รับภาพรวมของไฟล์ q ภาษา.
Kdb + มาพร้อมกับภาษาโปรแกรมในตัวที่เรียกว่า q. ประกอบด้วยส่วนเหนือของ SQL มาตรฐานซึ่งขยายออกไปสำหรับการวิเคราะห์อนุกรมเวลาและมีข้อดีมากมายกว่าเวอร์ชันมาตรฐาน ใครก็ตามที่คุ้นเคยกับ SQL สามารถเรียนรู้ได้q ภายในเวลาไม่กี่วันและสามารถเขียนคำค้นหาเฉพาะกิจของเธอเองได้อย่างรวดเร็ว
การเริ่มต้นสภาพแวดล้อม“ q”
ในการเริ่มใช้ kdb + คุณต้องเริ่มไฟล์ qเซสชัน มีสามวิธีในการเริ่มต้นไฟล์q เซสชั่น -
เพียงพิมพ์“ c: /q/w32/q.exe” บนรันเทอร์มินัลของคุณ
เริ่มเทอร์มินัลคำสั่ง MS-DOS และพิมพ์ q.
คัดลอกไฟล์ q.exe ไฟล์ไปยัง“ C: \ Windows \ System32” และบนรันเทอร์มินัลเพียงพิมพ์“ q”
ที่นี่เราสมมติว่าคุณกำลังทำงานบนแพลตฟอร์ม Windows
ประเภทข้อมูล
ตารางต่อไปนี้แสดงรายการประเภทข้อมูลที่รองรับ -
ชื่อ | ตัวอย่าง | ถ่าน | ประเภท | ขนาด |
---|---|---|---|---|
บูลีน | 1b | ข | 1 | 1 |
ไบต์ | 0xff | x | 4 | 1 |
สั้น | 23 ชม | ซ | 5 | 2 |
int | 23i | ผม | 6 | 4 |
ยาว | 23j | ญ | 7 | 8 |
จริง | 2.3e | จ | 8 | 4 |
ลอย | 2.3f | ฉ | 9 | 8 |
ถ่าน | “ ก” | ค | 10 | 1 |
varchar | `ab | เอส | 11 | * |
เดือน | 2546.03 ม | ม | 13 | 4 |
วันที่ | 2015.03.17T18: 01: 40.134 | z | 15 | 8 |
นาที | 08:31 น | ยู | 17 | 4 |
วินาที | 08:31:53 น | v | 18 | 4 |
เวลา | 18: 03: 18.521 | t | 19 | 4 |
enum | `u $` b โดยที่ u: `a`b | * | 20 | 4 |
การสร้างอะตอมและรายการ
อะตอมเป็นเอนทิตีเดียวเช่นตัวเลขตัวเดียวอักขระหรือสัญลักษณ์ ในตารางด้านบน (ประเภทข้อมูลที่แตกต่างกัน) ประเภทข้อมูลที่รองรับทั้งหมดคืออะตอม รายการคือลำดับของอะตอมหรือประเภทอื่น ๆ รวมทั้งรายการ
การส่งผ่านอะตอมชนิดใด ๆ ไปยังฟังก์ชันประเภท monadic (เช่นฟังก์ชันอาร์กิวเมนต์เดี่ยว) จะส่งกลับค่าเป็นลบกล่าวคือ –nในขณะที่การส่งรายการอะตอมเหล่านั้นไปยังฟังก์ชัน type จะส่งกลับค่าเป็นบวก n.
ตัวอย่างที่ 1 - อะตอมและการสร้างรายการ
/ 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
มักจะต้องเปลี่ยนประเภทข้อมูลของข้อมูลบางประเภทจากประเภทหนึ่งไปเป็นอีกประเภทหนึ่ง ฟังก์ชันการหล่อมาตรฐานคือ“ $”dyadic operator.
ใช้สามวิธีในการส่งจากประเภทหนึ่งไปยังอีกประเภทหนึ่ง (ยกเว้นสตริง) -
- ระบุประเภทข้อมูลที่ต้องการตามชื่อสัญลักษณ์
- ระบุประเภทข้อมูลที่ต้องการตามอักขระ
- ระบุประเภทข้อมูลที่ต้องการโดยใช้ค่าสั้น
การหล่อจำนวนเต็มเพื่อลอยตัว
ในตัวอย่างต่อไปนี้ของการหล่อจำนวนเต็มเพื่อลอยวิธีการหล่อทั้งสามแบบจะเทียบเท่ากัน -
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
ตรวจสอบว่าการดำเนินการทั้งสามเทียบเท่ากันหรือไม่
q)($[`float;a]~$["f";a]) and ($[`float;a] ~ $[9h;a])
1b
การหล่อสตริงเป็นสัญลักษณ์
การแคสต์สตริงเป็นสัญลักษณ์และในทางกลับกันจะทำงานแตกต่างกันเล็กน้อย มาดูตัวอย่างกัน -
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
การพยายามร่ายสตริงเป็นสัญลักษณ์โดยใช้คำสำคัญ `สัญลักษณ์หรือ 11h จะล้มเหลวด้วยข้อผิดพลาดประเภท -
q)b
"Hello"
"World"
"HelloWorld"
q)`symbol$b
'type
q)11h$b
'type
การแคสต์สตริงเป็นไม่ใช่สัญลักษณ์
การแคสต์สตริงไปยังประเภทข้อมูลอื่นที่ไม่ใช่สัญลักษณ์ทำได้ดังนี้ -
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
ดังนั้นเพื่อโยนสตริงทั้งหมด (รายการอักขระ) ไปยังอะตอมเดียวของชนิดข้อมูล x กำหนดให้เราต้องระบุอักษรตัวพิมพ์ใหญ่ที่แสดงถึงชนิดข้อมูล x เป็นอาร์กิวเมนต์แรกของ $ตัวดำเนินการ หากคุณระบุประเภทข้อมูลของx ในทางอื่นก็ส่งผลให้การแคสต์ถูกนำไปใช้กับอักขระแต่ละตัวของสตริง
q ภาษามีหลายวิธีในการแสดงและจัดการข้อมูลชั่วคราวเช่นเวลาและวันที่
วันที่
วันที่ใน kdb + จะถูกเก็บไว้ภายในเป็นจำนวนเต็มของวันนับตั้งแต่วันที่อ้างอิงของเราคือ 01Jan2000 วันที่หลังจากวันที่นี้จะถูกเก็บไว้ภายในเป็นจำนวนบวกและวันที่ก่อนหน้านั้นจะอ้างอิงเป็นจำนวนลบ
ตามค่าเริ่มต้นวันที่จะเขียนในรูปแบบ“ 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 สามารถดำเนินการได้โดยตรงในวันที่
q)x+1 / Add one day
2015.01.23
q)x-7 / Subtract 7 days
2015.01.15
วันที่ 1 มกราคม 2000 ตรงกับวันเสาร์ ดังนั้นวันเสาร์ใด ๆ ตลอดประวัติศาสตร์หรือในอนาคตเมื่อหารด้วย 7 จะให้ผลที่เหลือเป็น 0 วันอาทิตย์ให้ 1 ผลของวันจันทร์ 2
Day mod 7
Saturday 0
Sunday 1
Monday 2
Tuesday 3
Wednesday 4
Thursday 5
Friday 6
ครั้ง
เวลาจะถูกเก็บไว้ภายในเป็นจำนวนเต็มของมิลลิวินาทีนับตั้งแต่จังหวะเที่ยงคืน เวลาเขียนในรูปแบบ 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
ในกรณีของวันที่สามารถคำนวณเลขคณิตได้โดยตรงตามเวลา
วันที่
วันที่และเวลาคือการรวมกันของวันที่และเวลาโดยคั่นด้วย 'T' เช่นเดียวกับรูปแบบมาตรฐาน ISO ค่าวันที่และเวลาเก็บจำนวนวันที่เป็นเศษส่วนตั้งแต่เที่ยงคืน 1 ม.ค. 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
การนับวันเศษส่วนพื้นฐานสามารถหาได้โดยการหล่อให้ลอย
รายการเป็นส่วนประกอบพื้นฐานของ q languageดังนั้นความเข้าใจอย่างถ่องแท้เกี่ยวกับรายการจึงมีความสำคัญมาก รายการเป็นเพียงชุดสะสมของอะตอม (องค์ประกอบอะตอม) และรายการอื่น ๆ (กลุ่มของอะตอมหนึ่งหรือหลายอะตอม)
ประเภทของรายการ
ก general listใส่ไอเท็มไว้ในวงเล็บที่ตรงกันและคั่นด้วยอัฒภาค ตัวอย่างเช่น -
(9;8;7) or ("a"; "b"; "c") or (-10.0; 3.1415e; `abcd; "r")
หากรายการประกอบด้วยอะตอมประเภทเดียวกันจะเรียกว่า a uniform list. ที่อื่นเป็นที่รู้จักกันในชื่อไฟล์general list (ชนิดผสม).
นับ
เราสามารถรับจำนวนสิ่งของในรายการผ่านการนับ
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
ตัวอย่างรายการง่ายๆ
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.
รายการประกอบด้วยอะตอมหรือรายการ To create a single item listเราใช้ -
q)singleton:enlist 42
q)singleton
,42
To distinguish between an atom and the equivalent singletonตรวจสอบสัญลักษณ์ของประเภทของพวกเขา
q)signum type 42
-1i
q)signum type enlist 42
1i
รายการจะเรียงลำดับจากซ้ายไปขวาตามตำแหน่งของรายการ ค่าชดเชยของรายการจากจุดเริ่มต้นของรายการเรียกว่าindex. ดังนั้นรายการแรกจึงมีดัชนี 0 รายการที่สอง (ถ้ามี) มีดัชนี 1 เป็นต้นรายการนับn มีโดเมนดัชนีจาก 0 ถึง n–1.
สัญกรณ์ดัชนี
ให้รายชื่อ Lรายการที่ดัชนี i เข้าถึงได้โดย L[i]. เรียกรายการโดยดัชนีเรียกว่าitem indexing. ตัวอย่างเช่น,
q)L:(99;98.7e;`b;`abc;"z")
q)L[0]
99
q)L[1]
98.7e
q)L[4]
"z
การกำหนดดัชนี
รายการในรายการยังสามารถกำหนดผ่านการจัดทำดัชนีรายการ ด้วยประการฉะนี้
q)L1:9 8 7
q)L1[2]:66 / Indexed assignment into a simple list
/ enforces strict type matching.
q)L1
9 8 66
รายการจากตัวแปร
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)
การเข้าร่วมรายการ
การดำเนินการที่พบบ่อยที่สุดในสองรายการคือการรวมเข้าด้วยกันเพื่อสร้างรายการที่ใหญ่ขึ้น อย่างแม่นยำยิ่งขึ้นตัวดำเนินการ join (,) ต่อท้ายตัวถูกดำเนินการด้านขวาที่ส่วนท้ายของตัวถูกดำเนินการด้านซ้ายและส่งคืนผลลัพธ์ ยอมรับอะตอมในอาร์กิวเมนต์อย่างใดอย่างหนึ่ง
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
การทำรัง
ความซับซ้อนของข้อมูลถูกสร้างขึ้นโดยใช้รายการเป็นรายการของรายการ
ความลึก
จำนวนระดับของการซ้อนรายการเรียกว่าระดับความลึก อะตอมมีความลึก 0 และรายการแบบง่ายมีความลึก 1
q)l1:(9;8;(99;88))
q)count l1
3
นี่คือรายการความลึก 3 ที่มีสองรายการ -
q)l5
9
(90;180;900 1800 2700 3600)
q)count l5
2
q)count l5[1]
3
การสร้างดัชนีที่ความลึก
เป็นไปได้ที่จะจัดทำดัชนีโดยตรงในรายการของรายการที่ซ้อนกัน
Repeated Item Indexing
การดึงรายการผ่านดัชนีเดียวจะดึงข้อมูลที่อยู่บนสุดจากรายการที่ซ้อนกันเสมอ
q)L:(1;(100;200;(300;400;500;600)))
q)L[0]
1
q)L[1]
100
200
300 400 500 600
เนื่องจากผล L[1] เป็นรายการเราสามารถดึงข้อมูลองค์ประกอบโดยใช้ดัชนีเดียว
q)L[1][2]
300 400 500 600
เราสามารถทำดัชนีเดี่ยวซ้ำอีกครั้งเพื่อดึงข้อมูลจากรายการที่ซ้อนกันด้านในสุด
q)L[1][2][0]
300
คุณสามารถอ่านสิ่งนี้เป็น
รับรายการที่ดัชนี 1 จาก L และจากนั้นดึงข้อมูลที่ดัชนี 2 และจากนั้นดึงข้อมูลที่ดัชนี 0
Notation for Indexing at Depth
มีสัญกรณ์อื่นสำหรับการทำดัชนีซ้ำในองค์ประกอบของรายการที่ซ้อนกัน การดึงข้อมูลล่าสุดสามารถเขียนเป็น
q)L[1;2;0]
300
การมอบหมายงานผ่านดัชนียังทำงานที่ระดับความลึก
q)L[1;2;1]:900
q)L
1
(100;200;300 900 500 600)
ดัชนีที่กำหนด
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,
ดึงรายการทั้งหมดในตำแหน่งที่สองของแต่ละรายการที่ระดับบนสุด
Interpret L[;;2] as,
ดึงข้อมูลในตำแหน่งที่สามสำหรับแต่ละรายการในระดับที่สอง
พจนานุกรมเป็นส่วนขยายของรายการที่เป็นรากฐานสำหรับการสร้างตาราง ในแง่คณิตศาสตร์พจนานุกรมจะสร้างไฟล์
“ โดเมน→ช่วง”
หรือโดยทั่วไป (สั้น) สร้าง
“ คีย์→ค่า”
ความสัมพันธ์ระหว่างองค์ประกอบ
พจนานุกรมคือชุดของคู่คีย์ - ค่าที่เรียงตามลำดับซึ่งเทียบเท่ากับตารางแฮช พจนานุกรมคือการแมปที่กำหนดโดยการเชื่อมโยง I / O อย่างชัดเจนระหว่างรายการโดเมนและรายการช่วงผ่านการโต้ตอบตำแหน่ง การสร้างพจนานุกรมใช้ "xkey" ดั้งเดิม (!)
ListOfDomain ! ListOfRange
พจนานุกรมขั้นพื้นฐานที่สุดจะจับคู่รายการง่ายๆกับรายการง่ายๆ
อินพุต (I) | เอาท์พุท (O) |
---|---|
`ชื่อ | `จอห์น |
`อายุ | 36 |
`เพศ | “ M” |
น้ำหนัก | 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
ค้นหา
การค้นหาค่าเอาต์พุตพจนานุกรมที่สอดคล้องกับค่าอินพุตเรียกว่า looking up อินพุต
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"
ค้นหาด้วย Verb @
q)d1:`one`two`three!9 18 27
q)d1[`two]
18
q)d1@`two
18
การดำเนินการเกี่ยวกับพจนานุกรม
แก้ไขและอัปเดต
เช่นเดียวกับรายการรายการของพจนานุกรมสามารถแก้ไขได้ผ่านการกำหนดดัชนี
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
พจนานุกรมสามารถขยายได้ผ่านการกำหนดดัชนี
q)d[`Height]:"182 Ft"
q)d
Name | `John
Age | 35
Sex | "M"
Weight | 60.3
Height | "182 Ft"
Reverse Lookup ด้วย Find (?)
ตัวดำเนินการ find (?) ใช้เพื่อทำการค้นหาแบบย้อนกลับโดยการแมปช่วงขององค์ประกอบกับองค์ประกอบโดเมน
q)d2:`x`y`z!99 88 77
q)d2?77
`z
ในกรณีที่องค์ประกอบของรายการไม่ซ้ำกันไฟล์ find ส่งคืนการแมปรายการแรกจากรายการโดเมน
การลบรายการ
ในการลบรายการออกจากพจนานุกรมไฟล์ delete ( _ ) functionถูกนำมาใช้. ตัวถูกดำเนินการด้านซ้ายของ (_) คือพจนานุกรมและตัวถูกดำเนินการด้านขวาคือค่าคีย์
q)d2:`x`y`z!99 88 77
q)d2 _`z
x| 99
y| 88
ต้องมีช่องว่างทางด้านซ้ายของ _ ถ้าตัวถูกดำเนินการตัวแรกเป็นตัวแปร
q)`x`y _ d2 / Deleting multiple entries
z| 77
พจนานุกรมคอลัมน์
พจนานุกรมคอลัมน์เป็นพื้นฐานสำหรับการสร้างตาราง ลองพิจารณาตัวอย่างต่อไปนี้ -
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
พลิกพจนานุกรม
ผลสุทธิของการพลิกพจนานุกรมคอลัมน์เป็นเพียงการย้อนกลับลำดับของดัชนี สิ่งนี้เทียบเท่ากับการย้ายแถวและคอลัมน์ในเชิงตรรกะ
พลิกพจนานุกรมคอลัมน์
ทรานสโพสของพจนานุกรมได้มาจากการใช้ตัวดำเนินการพลิกยูนารี ดูตัวอย่างต่อไปนี้ -
q)scores
name | John Jenny Jonathan
id | 9 18 27
q)flip scores
name id
---------------
John 9
Jenny 18
Jonathan 27
พลิกพจนานุกรมคอลัมน์พลิก
หากคุณเปลี่ยนพจนานุกรมสองครั้งคุณจะได้รับพจนานุกรมต้นฉบับ
q)scores ~ flip flip scores
1b
ตารางเป็นหัวใจสำคัญของ kdb + ตารางคือชุดของคอลัมน์ที่มีชื่อที่นำมาใช้เป็นพจนานุกรมq tables เป็นแนวคอลัมน์
การสร้างตาราง
ตารางถูกสร้างขึ้นโดยใช้ไวยากรณ์ต่อไปนี้ -
q)trade:([]time:();sym:();price:();size:())
q)trade
time sym price size
-------------------
ในตัวอย่างข้างต้นเราไม่ได้ระบุประเภทของแต่ละคอลัมน์ สิ่งนี้จะถูกกำหนดโดยการแทรกแรกลงในตาราง
อีกวิธีหนึ่งเราสามารถระบุประเภทคอลัมน์ในการเริ่มต้น -
q)trade:([]time:`time$();sym:`$();price:`float$();size:`int$())
หรือเราสามารถกำหนดตารางที่ไม่ว่างได้ -
q)trade:([]sym:(`a`b);price:(1 2))
q)trade
sym price
-------------
a 1
b 2
หากไม่มีคอลัมน์ในวงเล็บเหลี่ยมดังตัวอย่างด้านบนตารางคือ unkeyed.
เพื่อสร้างไฟล์ keyed tableเราใส่คอลัมน์สำหรับคีย์ในวงเล็บเหลี่ยม
q)trade:([sym:`$()]time:`time$();price:`float$();size:`int$())
q)trade
sym | time price size
----- | ---------------
คุณยังสามารถกำหนดประเภทคอลัมน์โดยกำหนดค่าให้เป็นรายการว่างประเภทต่างๆ -
q)trade:([]time:0#0Nt;sym:0#`;price:0#0n;size:0#0N)
การรับข้อมูลตาราง
มาสร้างตารางการค้า -
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
คีย์หลักและตารางคีย์
ตารางคีย์
ตารางคีย์คือพจนานุกรมที่แมปแต่ละแถวในตารางของคีย์ที่ไม่ซ้ำกันกับแถวที่เกี่ยวข้องในตารางค่า ให้เราดูตัวอย่าง -
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
ตอนนี้สร้างตารางคีย์อย่างง่ายที่มี eid เป็นคีย์
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
ก foreign key กำหนดการแมปจากแถวของตารางซึ่งกำหนดให้กับแถวของตารางที่สอดคล้องกัน primary key.
คีย์ต่างประเทศให้ referential integrity. กล่าวอีกนัยหนึ่งความพยายามที่จะแทรกค่าคีย์ต่างประเทศที่ไม่ได้อยู่ในคีย์หลักจะล้มเหลว
ลองพิจารณาตัวอย่างต่อไปนี้ ในตัวอย่างแรกเราจะกำหนดคีย์ต่างประเทศอย่างชัดเจนเกี่ยวกับการเริ่มต้น ในตัวอย่างที่สองเราจะใช้การไล่คีย์ต่างประเทศซึ่งไม่ถือว่าความสัมพันธ์ก่อนหน้านี้ระหว่างสองตาราง
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)
ในการใช้การไล่คีย์ต่างประเทศเราต้องสร้างตารางเพื่อคีย์ลงในเซกเตอร์
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
สัญกรณ์ทั่วไปสำหรับคีย์ต่างประเทศที่กำหนดไว้ล่วงหน้า -
เลือก ab จาก c โดยที่ a เป็นคีย์ต่างประเทศ (sym), b คือ a
ในตารางคีย์หลัก (ind), c คือ
ตารางคีย์ต่างประเทศ (การค้า)
การจัดการตาราง
มาสร้างตารางการค้าหนึ่งตารางและตรวจสอบผลลัพธ์ของนิพจน์ตารางที่แตกต่างกัน -
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
ตอนนี้ให้เรามาดูคำสั่งที่ใช้ในการจัดการตารางโดยใช้ q ภาษา.
เลือก
ไวยากรณ์ที่จะใช้ a Select คำสั่งมีดังนี้ -
select [columns] [by columns] from table [where clause]
ตอนนี้เรามาดูตัวอย่างเพื่อสาธิตวิธีใช้คำสั่ง 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
แทรก
ไวยากรณ์ที่จะใช้ Insert คำสั่งมีดังนี้ -
`tablename insert (values)
Insert[`tablename; values]
ตอนนี้ให้เราดูตัวอย่างเพื่อสาธิตวิธีการใช้คำสั่งแทรก -
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
ลบ
ไวยากรณ์ที่จะใช้ a Delete คำสั่งมีดังนี้ -
delete columns from table
delete from table where clause
ตอนนี้เรามาดูตัวอย่างเพื่อสาธิตวิธีการใช้คำสั่ง Delete -
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
อัปเดต
ไวยากรณ์ที่จะใช้ Update คำสั่งมีดังนี้ -
update column: newValue from table where ….
ใช้ไวยากรณ์ต่อไปนี้เพื่ออัปเดตรูปแบบ / ประเภทข้อมูลของคอลัมน์โดยใช้ฟังก์ชันแคสต์ -
update column:newValue from `table where …
ตอนนี้ให้เราดูตัวอย่างเพื่อสาธิตวิธีการใช้งาน Update คำสั่ง -
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 + มีคำนามคำกริยาและคำวิเศษณ์ อ็อบเจ็กต์ข้อมูลและฟังก์ชันทั้งหมดคือnouns. Verbs เพิ่มความสามารถในการอ่านโดยลดจำนวนวงเล็บเหลี่ยมและวงเล็บในนิพจน์ Adverbsแก้ไขฟังก์ชันและคำกริยา dyadic (2 อาร์กิวเมนต์) เพื่อสร้างคำกริยาใหม่ที่เกี่ยวข้อง ฟังก์ชันที่สร้างโดยคำวิเศษณ์เรียกว่าderived functions หรือ derived verbs.
แต่ละ
คำวิเศษณ์ eachแสดงโดย (`) แก้ไขฟังก์ชัน dyadic และคำกริยาเพื่อใช้กับรายการของรายการแทนที่จะเป็นรายการเอง ดูตัวอย่างต่อไปนี้ -
q)1, (2 3 5) / Join
1 2 3 5
q)1, '( 2 3 4) / Join each
1 2
1 3
1 4
มีรูปแบบของ Eachสำหรับฟังก์ชัน monadic ที่ใช้คีย์เวิร์ด“ each” ตัวอย่างเช่น,
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
แต่ละซ้ายและแต่ละขวา
มีสองตัวแปรของแต่ละฟังก์ชันสำหรับฟังก์ชัน dyadic ที่เรียกว่า Each-Left (\ :) และ Each-Right(/ :). ตัวอย่างต่อไปนี้จะอธิบายวิธีการใช้งาน
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
ใน qภาษาเรามีการรวมประเภทต่างๆตามตารางอินพุตที่ให้มาและประเภทของตารางที่เข้าร่วมที่เราต้องการ การรวมรวมข้อมูลจากสองตาราง นอกจากการไล่คีย์ต่างประเทศแล้วยังมีอีกสี่วิธีในการเข้าร่วมตาราง -
- เข้าร่วมง่ายๆ
- Asof เข้าร่วม
- เข้าร่วมทางซ้าย
- เข้าร่วมสหภาพ
ในบทนี้เราจะพูดถึงการรวมแต่ละส่วนโดยละเอียด
เข้าร่วมง่ายๆ
การเข้าร่วมแบบง่ายเป็นประเภทการเข้าร่วมขั้นพื้นฐานที่สุดโดยใช้เครื่องหมายจุลภาค "," ในกรณีนี้ตารางทั้งสองจะต้องเป็นtype conformantกล่าวคือทั้งสองตารางมีจำนวนคอลัมน์เท่ากันในลำดับเดียวกันและคีย์เดียวกัน
table1,:table2 / table1 is assigned the value of table2
เราสามารถใช้คอมมา - แต่ละการรวมสำหรับตารางที่มีความยาวเท่ากันเพื่อเข้าร่วมด้านข้าง คุณสามารถป้อนตารางใดตารางหนึ่งได้ที่นี่
Table1, `Table2
Asof เข้าร่วม (aj)
เป็นการรวมที่ทรงพลังที่สุดซึ่งใช้เพื่อรับค่าของเขตข้อมูลในตารางหนึ่งเมื่อเทียบกับเวลาในตารางอื่น โดยทั่วไปจะใช้เพื่อรับการเสนอราคาที่เหนือกว่าและถามในช่วงเวลาของการซื้อขายแต่ละครั้ง
รูปแบบทั่วไป
aj[joinColumns;tbl1;tbl2]
ตัวอย่างเช่น,
aj[`sym`time;trade;quote]
ตัวอย่าง
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
เข้าร่วมทางซ้าย (lj)
เป็นกรณีพิเศษของ aj ที่อาร์กิวเมนต์ที่สองเป็นตารางที่มีคีย์และอาร์กิวเมนต์แรกมีคอลัมน์ของคีย์ของอาร์กิวเมนต์ที่ถูกต้อง
รูปแบบทั่วไป
table1 lj Keyed-table
ตัวอย่าง
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
เข้าร่วมยูเนี่ยน (uj)
อนุญาตให้สร้างการรวมกันของสองตารางที่มีสคีมาที่แตกต่างกัน โดยพื้นฐานแล้วเป็นส่วนขยายของการเข้าร่วมแบบง่าย (,)
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
หากคุณใช้ uj บนตารางที่คีย์คีย์หลักจะต้องตรงกัน
ประเภทของฟังก์ชัน
ฟังก์ชันสามารถจำแนกได้หลายวิธี ที่นี่เราได้จัดประเภทตามจำนวนและประเภทของอาร์กิวเมนต์ที่ใช้และประเภทผลลัพธ์ ฟังก์ชั่นสามารถ
Atomic - โดยที่อาร์กิวเมนต์เป็นอะตอมและให้ผลลัพธ์แบบอะตอม
Aggregate - อะตอมจากรายการ
Uniform (list from list)- ขยายแนวคิดของอะตอมเมื่อนำไปใช้กับรายการ จำนวนรายการอาร์กิวเมนต์เท่ากับจำนวนรายการผลลัพธ์
Other - หากฟังก์ชันไม่ได้มาจากหมวดหมู่ด้านบน
เรียกว่าการดำเนินการทวิภาคในคณิตศาสตร์ dyadic functionsใน q; ตัวอย่างเช่น“ +” เรียกการดำเนินการแบบยูนารีในทำนองเดียวกันmonadic functions; ตัวอย่างเช่น "abs" หรือ "floor"
ฟังก์ชั่นที่ใช้บ่อย
มีฟังก์ชั่นที่ใช้บ่อยใน qการเขียนโปรแกรม ในส่วนนี้เราจะเห็นการใช้งานฟังก์ชั่นยอดนิยมบางอย่าง -
หน้าท้อง
q) abs -9.9 / Absolute value, Negates -ve number & leaves non -ve number
9.9
ทั้งหมด
q) all 4 5 0 -4 / Logical AND (numeric min), returns the minimum value
0b
Max (&), Min (|) และ 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
ค่าเฉลี่ย
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)
โดย
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
นับ
q)count (til 9) / Count list, count the elements in a list and
/ return a single int value 9
ท่าเรือ
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
ตัด
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"
ลบ
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
โดดเด่น
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
เกณฑ์สมัครเข้า
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
เติม (^)
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
เติม
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
อันดับแรก
q)/first - returns the first atom of a list
q)first 1 3 34 5 3
1
พลิก
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
ใน
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
แทรก
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
สำคัญ
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..
ต่ำกว่า
q)/lower - Convert to lower case and floor
q)lower ("JoHn";`HERRY`SYM)
"john"
`herry`sym
สูงสุดและต่ำสุด (เช่น | และ &)
q)/Max and Min / a|b and a&b
q)9|7
9
q)9&5
5
โมฆะ
q)/null - return 1b if the atom is a null else 0b from the argument list
q)null 1 3 3 0N
0001b
ลูกพีช
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
ก่อนหน้า
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
สุ่ม (?)
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
Raze
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
อ่าน 0
q)/read0 - Read in a text file
q)read0 `:c:/q/README.txt / gives the contents of *.txt file
อ่าน 1
q)/read1 - Read in a q data file
q)read1 `:c:/q/t1
0xff016200630b000500000073796d0074696d6500707269636…
ย้อนกลับ
q)/reverse - Reverse a list
q)reverse 2 30 29 1 3 4
4 3 1 29 30 2
q)reverse "HelloWorld"
"dlroWolleH"
ชุด
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"
สตริง
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
ระบบ
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"
ตาราง
q)/tables - list all tables
q)tables `
`s#`tab1`tab2`trade
ถึง
q)/til - Enumerate
q)til 5
0 1 2 3 4
ตัดแต่ง
q)/trim - Eliminate string spaces
q)trim " John "
"John"
เทียบกับ
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
คำสั่งระบบ
คำสั่งระบบควบคุมไฟล์ qสิ่งแวดล้อม. มีรูปแบบดังต่อไปนี้ -
\cmd [p] where p may be optional
คำสั่งระบบยอดนิยมบางคำสั่งได้รับการกล่าวถึงด้านล่าง -
\ a [เนมสเปซ] - แสดงรายการตารางในเนมสเปซที่กำหนด
q)/Tables in default namespace
q)\a
,`trade
q)\a .o / table in .o namespace.
,`TI
\ b - ดูการอ้างอิง
q)/ views/dependencies
q)a:: x+y / global assingment
q)b:: x+1
q)\b
`s#`a`b
\ B - การดู / การอ้างอิงที่รอดำเนินการ
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 - เปลี่ยนไดเร็กทอรี
q)/change directory, \cd [name]
q)\cd
"C:\\Users\\myaccount-raj"
q)\cd ../new-account
q)\cd
"C:\\Users\\new-account"
\ d - ตั้งค่าเนมสเปซปัจจุบัน
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 - โหลดไฟล์หรือไดเร็กทอรีจาก 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 - หมายเลขพอร์ต
q)/ assign port number, \p
q)\p
5001i
q)\p 8888
q)\p
8888i
\\ - ออกจากคอนโซล q
\\ - exit
Exit form q.
qภาษาโปรแกรมมีชุดฟังก์ชันในตัวที่หลากหลายและทรงพลัง ฟังก์ชันในตัวสามารถเป็นประเภทต่อไปนี้ -
String function - รับสตริงเป็นอินพุตและส่งคืนสตริง
Aggregate function - รับรายการเป็นอินพุตและส่งคืนอะตอม
Uniform function - รับรายการและส่งกลับรายการของการนับเดียวกัน
Mathematical function - ใช้อาร์กิวเมนต์ที่เป็นตัวเลขและส่งกลับอาร์กิวเมนต์ที่เป็นตัวเลข
Miscellaneous function - ฟังก์ชั่นทั้งหมดนอกเหนือจากที่กล่าวไว้ข้างต้น
ฟังก์ชันสตริง
Like - การจับคู่รูปแบบ
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 - ลบช่องว่างชั้นนำ
q)/ ltrim - monadic ltrim takes string argument, removes leading blanks
q)ltrim " Rick "
"Rick "
rtrim - ลบช่องว่างต่อท้าย
q)/rtrim - takes string argument, returns the result of removing trailing blanks
q)rtrim " Rick "
" Rick"
ss - การค้นหาสตริง
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
ตัดแต่ง - ลบช่องว่างด้านหน้าและด้านหลัง
q)/trim - takes string argument, returns the result of removing leading & trailing blanks
q)trim " John "
"John"
ฟังก์ชันทางคณิตศาสตร์
acos - ผกผันของ 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 - ให้ความสัมพันธ์
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
ผลิตภัณฑ์ข้ามคาร์ทีเซียน
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 - ความแปรปรวน
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
ฟังก์ชันรวม
ทั้งหมด - & การดำเนินการ
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
ใด ๆ - | การดำเนินการ
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 - ผลิตภัณฑ์เลขคณิต
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
ผลรวม - ผลรวมเลขคณิต
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
ฟังก์ชั่นเครื่องแบบ
Deltas - ความแตกต่างจากรายการก่อนหน้า
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
เติม - เติมค่า 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
สูงสุด - สูงสุดสะสม
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
ฟังก์ชันเบ็ดเตล็ด
นับ - ส่งคืนจำนวนองค์ประกอบ
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
แตกต่าง - ส่งคืนเอนทิตีที่แตกต่างกัน
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
ยกเว้น - องค์ประกอบไม่อยู่ในอาร์กิวเมนต์ที่สอง
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
เติม - เติม null ด้วยอาร์กิวเมนต์แรก
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"
แบบสอบถามใน qสั้นและง่ายกว่าและขยายความสามารถของ sql นิพจน์แบบสอบถามหลักคือ 'เลือกนิพจน์' ซึ่งในรูปแบบที่ง่ายที่สุดจะแยกตารางย่อยออก แต่ยังสามารถสร้างคอลัมน์ใหม่ได้
รูปแบบทั่วไปของไฟล์ Select expression มีดังนี้ -
Select columns by columns from table where conditions
**Note − by & where วลีเป็นทางเลือกต้องใช้เฉพาะ 'from expression' เท่านั้น
โดยทั่วไปไวยากรณ์จะเป็น -
select [a] [by b] from t [where c]
update [a] [by b] from t [where c]
ไวยากรณ์ของ q นิพจน์มีลักษณะค่อนข้างคล้ายกับ SQL แต่ qสำนวนเรียบง่ายและทรงพลัง นิพจน์ sql ที่เท่ากันสำหรับข้างต้นq นิพจน์จะเป็นดังนี้ -
select [b] [a] from t [where c] [group by b order by b]
update t set [a] [where c]
ส่วนคำสั่งทั้งหมดดำเนินการกับคอลัมน์และดังนั้น qสามารถใช้ประโยชน์จากคำสั่งซื้อ เนื่องจากการสืบค้น Sql ไม่ได้ขึ้นอยู่กับลำดับจึงไม่สามารถใช้ประโยชน์ดังกล่าวได้
qแบบสอบถามเชิงสัมพันธ์โดยทั่วไปมีขนาดเล็กกว่ามากเมื่อเทียบกับ sql ที่เกี่ยวข้อง คำสั่งและคำสั่งที่ใช้งานได้ทำสิ่งที่ยากใน sql
ในฐานข้อมูลประวัติลำดับของ whereอนุประโยคมีความสำคัญมากเนื่องจากมีผลต่อประสิทธิภาพของแบบสอบถาม partition ตัวแปร (วันที่ / เดือน / วัน) มาก่อนตามด้วยคอลัมน์ที่เรียงลำดับและจัดทำดัชนี (โดยทั่วไปคือคอลัมน์ sym)
ตัวอย่างเช่น,
select from table where date in d, sym in s
เร็วกว่ามาก
select from table where sym in s, date in d
แบบสอบถามพื้นฐาน
ลองเขียนสคริปต์แบบสอบถามในแผ่นจดบันทึก (ด้านล่าง) บันทึก (เป็น * .q) จากนั้นโหลด
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.
แบบสอบถามที่มีข้อ จำกัด
* 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
การค้นหาด้วย Aggregations
* 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 + อนุญาตให้กระบวนการหนึ่งสื่อสารกับอีกกระบวนการหนึ่งผ่านการสื่อสารระหว่างกระบวนการ กระบวนการ Kdb + สามารถเชื่อมต่อกับ kdb + อื่น ๆ บนคอมพิวเตอร์เครื่องเดียวกันเครือข่ายเดียวกันหรือแม้แต่จากระยะไกล เราเพียงแค่ต้องระบุพอร์ตจากนั้นลูกค้าก็สามารถพูดคุยกับพอร์ตนั้นได้ ๆq กระบวนการสามารถสื่อสารกับผู้อื่นได้ q ดำเนินการตราบเท่าที่สามารถเข้าถึงได้บนเครือข่ายและกำลังรับฟังการเชื่อมต่อ
กระบวนการเซิร์ฟเวอร์รับฟังการเชื่อมต่อและประมวลผลคำขอใด ๆ
กระบวนการไคลเอ็นต์เริ่มต้นการเชื่อมต่อและส่งคำสั่งเพื่อดำเนินการ
ไคลเอนต์และเซิร์ฟเวอร์สามารถอยู่บนเครื่องเดียวกันหรือคนละเครื่องก็ได้ กระบวนการสามารถเป็นได้ทั้งไคลเอนต์และเซิร์ฟเวอร์
การสื่อสารสามารถ
Synchronous (รอผลที่จะส่งกลับ)
Asynchronous (ไม่ต้องรอและไม่มีผลลัพธ์กลับมา)
เริ่มต้นเซิร์ฟเวอร์
ก q เซิร์ฟเวอร์เริ่มต้นโดยการระบุพอร์ตที่จะรับฟัง
q –p 5001 / command line
\p 5001 / session command
ที่จับการสื่อสาร
แฮนเดิลการสื่อสารคือสัญลักษณ์ที่ขึ้นต้นด้วย“:” และมีรูปแบบ -
`:[server]:port-number
ตัวอย่าง
`::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
ในการเริ่มต้นการเชื่อมต่อเราใช้ฟังก์ชัน“ hopen” ซึ่งจะส่งกลับหมายเลขอ้างอิงการเชื่อมต่อจำนวนเต็ม หมายเลขอ้างอิงนี้ใช้สำหรับคำขอของไคลเอ็นต์ที่ตามมาทั้งหมด ตัวอย่างเช่น -
q)h:hopen `::5001
q)h"til 5"
0 1 2 3 4
q)hclose h
ข้อความซิงโครนัสและอะซิงโครนัส
เมื่อเราจับได้แล้วเราสามารถส่งข้อความได้ทั้งแบบซิงโครนัสหรืออะซิงโครนัส
Synchronous Message- เมื่อส่งข้อความแล้วจะรอและส่งคืนผลลัพธ์ รูปแบบมีดังนี้ -
handle “message”
Asynchronous Message- หลังจากส่งข้อความแล้วให้เริ่มประมวลผลคำสั่งถัดไปทันทีโดยไม่ต้องรอและส่งคืนผลลัพธ์ รูปแบบมีดังนี้ -
neg[handle] “message”
ข้อความที่ต้องการการตอบกลับเช่นการเรียกใช้ฟังก์ชันหรือคำสั่งเลือกโดยปกติจะใช้รูปแบบซิงโครนัส ในขณะที่ข้อความที่ไม่จำเป็นต้องส่งคืนเอาต์พุตเช่นการแทรกการอัปเดตลงในตารางจะเป็นแบบอะซิงโครนัส
เมื่อ q กระบวนการเชื่อมต่อกับอื่น qประมวลผลผ่านการสื่อสารระหว่างกระบวนการจะประมวลผลโดยตัวจัดการข้อความ ตัวจัดการข้อความเหล่านี้มีลักษณะการทำงานเริ่มต้น ตัวอย่างเช่นในกรณีของการจัดการข้อความแบบซิงโครนัสตัวจัดการจะส่งคืนค่าของแบบสอบถาม ตัวจัดการแบบซิงโครนัสในกรณีนี้คือ.z.pgซึ่งเราสามารถลบล้างได้ตามความต้องการ
กระบวนการ Kdb + มีตัวจัดการข้อความที่กำหนดไว้ล่วงหน้าหลายตัว ตัวจัดการข้อความมีความสำคัญสำหรับการกำหนดค่าฐานข้อมูล ประเพณีบางอย่าง ได้แก่ -
Logging - บันทึกข้อความขาเข้า (มีประโยชน์ในกรณีที่มีข้อผิดพลาดร้ายแรง)
Security- อนุญาต / ไม่อนุญาตให้เข้าถึงฐานข้อมูลการเรียกใช้ฟังก์ชันบางอย่าง ฯลฯ ตามชื่อผู้ใช้ / ที่อยู่ IP ช่วยในการเข้าถึงเฉพาะสมาชิกที่ได้รับอนุญาตเท่านั้น
Handle connections/disconnections จากกระบวนการอื่น ๆ
ตัวจัดการข้อความที่กำหนดไว้ล่วงหน้า
ตัวจัดการข้อความที่กำหนดไว้ล่วงหน้าบางส่วนจะกล่าวถึงด้านล่าง
.z.pg
เป็นตัวจัดการข้อความแบบซิงโครนัส (กระบวนการรับ) ฟังก์ชันนี้จะถูกเรียกโดยอัตโนมัติทุกครั้งที่ได้รับข้อความการซิงค์บนอินสแตนซ์ kdb +
พารามิเตอร์คือการเรียกสตริง / ฟังก์ชันที่จะดำเนินการกล่าวคือข้อความที่ส่งผ่าน โดยค่าเริ่มต้นจะกำหนดไว้ดังนี้ -
.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
เป็นตัวจัดการข้อความแบบอะซิงโครนัส (ชุดกระบวนการ) เป็นตัวจัดการที่เทียบเท่ากันสำหรับข้อความแบบอะซิงโครนัส พารามิเตอร์คือการเรียกใช้สตริง / ฟังก์ชันที่จะดำเนินการ โดยค่าเริ่มต้นจะถูกกำหนดเป็น
.z.pg : {value x} / Can be overriden for a customized action.
ต่อไปนี้เป็นตัวจัดการข้อความที่กำหนดเองสำหรับข้อความอะซิงโครนัสซึ่งเราได้ใช้การดำเนินการที่มีการป้องกัน
.z.pg: {@[value; x; errhandler x]}
ที่นี่ errhandler เป็นฟังก์ชันที่ใช้ในกรณีที่เกิดข้อผิดพลาดที่ไม่คาดคิด
.z.po []
เป็นตัวจัดการการเชื่อมต่อแบบเปิด (กระบวนการเปิด) จะดำเนินการเมื่อกระบวนการระยะไกลเปิดการเชื่อมต่อ หากต้องการดูจุดจับเมื่อเปิดการเชื่อมต่อกับกระบวนการเราสามารถกำหนด. z.po เป็น
.z.po : {Show “Connection opened by” , string h: .z.h}
.z.pc []
เป็นตัวจัดการการเชื่อมต่อแบบปิด (ปิดกระบวนการ) เรียกเมื่อการเชื่อมต่อถูกปิด เราสามารถสร้างตัวจัดการการปิดของเราเองซึ่งสามารถรีเซ็ตแฮนเดิลการเชื่อมต่อส่วนกลางเป็น 0 และออกคำสั่งเพื่อตั้งค่าตัวจับเวลาให้เริ่มทำงาน (ดำเนินการ) ทุกๆ 3 วินาที (3000 มิลลิวินาที)
.z.pc : { h::0; value “\\t 3000”}
ตัวจัดการตัวจับเวลา (.z.ts) พยายามเปิดการเชื่อมต่ออีกครั้ง เมื่อประสบความสำเร็จตัวจับเวลาจะปิด
.z.ts : { h:: hopen `::5001; if [h>0; value “\\t 0”] }
.z.pi []
PI ย่อมาจากการป้อนข้อมูลกระบวนการ เรียกว่าสำหรับการป้อนข้อมูลทุกประเภท สามารถใช้เพื่อจัดการอินพุตคอนโซลหรืออินพุตไคลเอ็นต์ระยะไกล การใช้. z.pi [] สามารถตรวจสอบอินพุตคอนโซลหรือแทนที่การแสดงผลเริ่มต้นได้ นอกจากนี้ยังสามารถใช้สำหรับการดำเนินการบันทึกประเภทใดก็ได้
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
เป็นตัวจัดการการเชื่อมต่อการตรวจสอบความถูกต้อง (การพิสูจน์ตัวตนผู้ใช้) เพิ่มการโทรกลับพิเศษเมื่อมีการเปิดการเชื่อมต่อกับเซสชัน kdb + เรียกว่าหลังจากการตรวจสอบ –u / -U และก่อน. z.po (พอร์ตเปิด)
.z.pw : {[user_id;passwd] 1b}
อินพุตคือ userid (สัญลักษณ์) และ password (ข้อความ).
รายการพจนานุกรมหรือคอลัมน์ของตารางสามารถใช้แอตทริบิวต์ได้ แอตทริบิวต์กำหนดคุณสมบัติบางอย่างในรายการ แอตทริบิวต์บางอย่างอาจหายไปจากการแก้ไข
ประเภทของคุณสมบัติ
จัดเรียง (s #)
`s # หมายถึงรายการจะเรียงลำดับจากน้อยไปมาก หากรายการถูกจัดเรียงอย่างชัดเจนโดย asc (หรือ xasc) รายการจะมีชุดแอตทริบิวต์ที่เรียงลำดับโดยอัตโนมัติ
q)L1: asc 40 30 20 50 9 4
q)L1
`s#4 9 20 30 40 50
รายการที่ทราบว่าจัดเรียงสามารถมีการตั้งค่าแอตทริบิวต์อย่างชัดเจน Q จะตรวจสอบว่ารายการถูกจัดเรียงหรือไม่และหากไม่เป็นเช่นนั้นไฟล์ s-fail ข้อผิดพลาดจะถูกโยนทิ้ง
q)L2:30 40 24 30 2
q)`s#L2
's-fail
แอตทริบิวต์ที่เรียงลำดับจะหายไปเมื่อผนวกไม่ได้เรียงลำดับ
แยกส่วน (`p #)
`p # หมายถึงรายการแยกส่วนและรายการที่เหมือนกันจะถูกจัดเก็บอย่างต่อเนื่องกัน
ช่วงคือไฟล์ int หรือ temporal type มีค่า int พื้นฐานเช่นปีเดือนวัน ฯลฯ คุณยังแบ่งพาร์ติชันบนสัญลักษณ์ได้หากมีการแจกแจง
การใช้แอตทริบิวต์ที่แยกส่วนจะสร้างพจนานุกรมดัชนีที่จับคู่ค่าเอาต์พุตที่ไม่ซ้ำกันแต่ละค่ากับตำแหน่งของการเกิดครั้งแรก เมื่อรายการถูกแยกออกการค้นหาจะเร็วกว่ามากเนื่องจากการค้นหาเชิงเส้นจะถูกแทนที่ด้วยการค้นหาแฮชแท็ก
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 −
แอตทริบิวต์ที่แยกส่วนจะไม่ถูกเก็บรักษาไว้ภายใต้การดำเนินการในรายการแม้ว่าการดำเนินการจะรักษาการแบ่งพาร์ติชันไว้
แอตทริบิวต์ที่แยกส่วนควรได้รับการพิจารณาเมื่อจำนวนเอนทิตีถึงพันล้านและพาร์ติชันส่วนใหญ่มีขนาดที่สำคัญกล่าวคือมีการทำซ้ำอย่างมีนัยสำคัญ
จัดกลุ่ม (`g #)
`g # หมายถึงรายการถูกจัดกลุ่ม พจนานุกรมภายในได้รับการสร้างและดูแลรักษาซึ่งจะจับคู่รายการที่ไม่ซ้ำกันแต่ละรายการกับดัชนีแต่ละรายการโดยต้องใช้พื้นที่จัดเก็บข้อมูลจำนวนมาก สำหรับรายการความยาวL ที่มี u รายการขนาดพิเศษ s, นี้จะเป็น (L × 4) + (u × s) ไบต์
การจัดกลุ่มสามารถนำไปใช้กับรายการเมื่อไม่สามารถสร้างสมมติฐานอื่น ๆ เกี่ยวกับโครงสร้างได้
แอตทริบิวต์สามารถนำไปใช้กับรายการที่พิมพ์ มันถูกเก็บรักษาไว้ในภาคผนวก แต่หายไปจากการลบ
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
ไม่ซ้ำใคร (`#u)
การใช้แอตทริบิวต์ที่ไม่ซ้ำกัน (`u #) กับรายการบ่งชี้ว่ารายการในรายการนั้นแตกต่างกัน การรู้ว่าองค์ประกอบของรายการมีลักษณะเฉพาะทำให้เร็วขึ้นอย่างมากdistinct และอนุญาต q เพื่อทำการเปรียบเทียบในช่วงต้น
เมื่อรายการถูกตั้งค่าสถานะเป็นไม่ซ้ำกันการแม็พแฮชภายในจะถูกสร้างขึ้นสำหรับแต่ละรายการในรายการ การดำเนินการในรายการต้องรักษาความเป็นเอกลักษณ์มิฉะนั้นแอตทริบิวต์จะสูญหาย
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 # ถูกเก็บรักษาไว้บนการเรียงต่อกันซึ่งรักษาความเป็นเอกลักษณ์ สูญเสียไปกับการลบและการต่อข้อมูลที่ไม่ซ้ำกัน
การค้นหารายการ u # ทำได้ผ่านฟังก์ชันแฮช
การลบแอตทริบิวต์
สามารถลบแอตทริบิวต์ได้โดยใช้ "#
การใช้คุณสมบัติ
สามรูปแบบสำหรับการใช้แอตทริบิวต์คือ -
L: `s# 14 2 3 3 9/ ระบุระหว่างการสร้างรายการ
@[ `.; `L ; `s#]/ Functional apply คือกับรายการตัวแปร L
/ ในเนมสเปซเริ่มต้น (เช่น ".) ใช้
/ แอตทริบิวต์ # s ที่เรียงลำดับ
Update `s#time from `tab
/ อัปเดตตาราง (แท็บ) เพื่อใช้ไฟล์
/ attribute.
ลองใช้รูปแบบที่แตกต่างกันสามรูปแบบข้างต้นพร้อมตัวอย่าง
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#).
คิวรีฟังก์ชัน (ไดนามิก) อนุญาตให้ระบุชื่อคอลัมน์เป็นสัญลักษณ์ของคอลัมน์ q-sql select / exec / delete ทั่วไป มีประโยชน์มากเมื่อเราต้องการระบุชื่อคอลัมน์แบบไดนามิก
รูปแบบการทำงานคือ -
?[t;c;b;a] / for select
![t;c;b;a] / for update
ที่ไหน
t เป็นโต๊ะ
a เป็นพจนานุกรมของมวลรวม
bโดยวลี; และ
c คือรายการข้อ จำกัด
หมายเหตุ -
ทั้งหมด q เอนทิตีใน a, bและ c ต้องอ้างอิงด้วยชื่อซึ่งหมายถึงสัญลักษณ์ที่มีชื่อเอนทิตี
รูปแบบวากยสัมพันธ์ของการเลือกและอัปเดตจะถูกแยกวิเคราะห์เป็นรูปแบบการทำงานที่เทียบเท่ากันโดยไฟล์ q ล่ามดังนั้นจึงไม่มีความแตกต่างด้านประสิทธิภาพระหว่างสองรูปแบบ
เลือกฟังก์ชัน
บล็อกโค้ดต่อไปนี้แสดงวิธีการใช้งาน 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
ตัวอย่าง 1
เริ่มต้นด้วยกรณีที่ง่ายที่สุดรุ่นที่ใช้งานได้ของ “select from t” จะมีลักษณะ -
q)?[t;();0b;()] / select from t
n p
-----------------
ibm 40
msft 38
samsung 45
apple 54
ตัวอย่าง 2
ในตัวอย่างต่อไปนี้เราใช้ฟังก์ชัน enlist เพื่อสร้าง singletons เพื่อให้แน่ใจว่ามีรายการเอนทิตีที่เหมาะสม
q)wherecon: enlist (>;`p;40)
q)?[`t;wherecon;0b;()] / select from t where p > 40
n p
----------------
samsung 45
apple 54
ตัวอย่างที่ 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
ผู้บริหารตามหน้าที่
รูปแบบการทำงานของ exec เป็นรูปแบบที่เรียบง่ายของ 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
การปรับปรุงการทำงาน
รูปแบบการทำงานของการอัปเดตนั้นคล้ายคลึงกับของ select. ในตัวอย่างต่อไปนี้การใช้ enlist คือการสร้าง singletons เพื่อให้แน่ใจว่า input entities เป็นรายการ
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
ลบฟังก์ชัน
การลบฟังก์ชันเป็นรูปแบบที่เรียบง่ายของการปรับปรุงการทำงาน ไวยากรณ์มีดังนี้ -
![t;c;0b;a] / t is a table, c is a list of where constraints, a is a
/ list of column names
ตอนนี้ให้เราเป็นตัวอย่างเพื่อแสดงให้เห็นว่าฟังก์ชันการลบทำงานอย่างไร -
q)![t; enlist (=;`p; 40); 0b;`symbol$()]
/ delete from t where p = 40
n p
---------------
msft 38
samsung 45
apple 54
ในบทนี้เราจะเรียนรู้วิธีการใช้งานพจนานุกรมและตาราง เริ่มจากพจนานุกรม -
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
หากต้องการแก้ไขค่าพจนานุกรมก็สามารถกำหนดรูปแบบการแก้ไขได้ -
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
ข้อมูลบนฮาร์ดดิสก์ของคุณ (เรียกอีกอย่างว่าฐานข้อมูลในอดีต) สามารถบันทึกได้ในสามรูปแบบที่แตกต่างกัน ได้แก่ Flat Files, Splayed Tables และ Partitioned Table ที่นี่เราจะเรียนรู้วิธีใช้รูปแบบทั้งสามนี้เพื่อบันทึกข้อมูล
ไฟล์แบน
ไฟล์แบบแบนจะถูกโหลดลงในหน่วยความจำอย่างสมบูรณ์ซึ่งเป็นสาเหตุที่ขนาด (รอยเท้าหน่วยความจำ) ควรมีขนาดเล็ก ตารางจะถูกบันทึกไว้ในดิสก์ทั้งหมดในไฟล์เดียว (ขนาดจึงมีความสำคัญ)
ฟังก์ชันที่ใช้จัดการตารางเหล่านี้คือ set/get -
`:path_to_file/filename set tablename
ลองดูตัวอย่างเพื่อสาธิตวิธีการทำงาน -
q)tables `.
`s#`t`tab`tab1
q)`:c:/q/w32/tab1_test set tab1
`:c:/q/w32/tab1_test
ในสภาพแวดล้อม Windows ไฟล์แบบแบนจะถูกบันทึกไว้ที่ตำแหน่ง - C:\q\w32
รับไฟล์แบบแบนจากดิสก์ของคุณ (ฐานข้อมูลประวัติ) และใช้ไฟล์ get คำสั่งดังนี้ -
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
มีการสร้างตารางใหม่ tab2 ด้วยเนื้อหาที่เก็บไว้ใน tab1_test ไฟล์.
ตารางการเล่น
หากมีคอลัมน์มากเกินไปในตารางเราจะจัดเก็บตารางดังกล่าวในรูปแบบแยกส่วนกล่าวคือเราบันทึกลงในดิสก์ในไดเร็กทอรี ภายในไดเร็กทอรีแต่ละคอลัมน์จะถูกบันทึกในไฟล์แยกต่างหากภายใต้ชื่อเดียวกับชื่อคอลัมน์ แต่ละคอลัมน์จะถูกบันทึกเป็นรายการประเภทที่เกี่ยวข้องในไฟล์ไบนารี kdb +
การบันทึกตารางในรูปแบบ splayed มีประโยชน์มากเมื่อเราต้องเข้าถึงคอลัมน์เพียงไม่กี่คอลัมน์บ่อยๆจากหลาย ๆ คอลัมน์ ไดเรกทอรีตารางแยกประกอบด้วย.d ไฟล์ไบนารีซึ่งมีลำดับของคอลัมน์
เช่นเดียวกับไฟล์แบนตารางสามารถบันทึกเป็น splayed โดยใช้ไฟล์ setคำสั่ง ในการบันทึกตารางเป็นสเปรย์พา ธ ไฟล์ควรลงท้ายด้วยแบ็กแลช -
`:path_to_filename/filename/ set tablename
สำหรับการอ่านตารางแบบแยกส่วนเราสามารถใช้ไฟล์ get ฟังก์ชัน -
tablename: get `:path_to_file/filename
Note - สำหรับตารางที่จะบันทึกเป็นสเปรย์ควรยกเลิกการใส่คีย์และระบุ
ในสภาพแวดล้อม Windows โครงสร้างไฟล์ของคุณจะปรากฏดังนี้ -
ตารางแบ่งพาร์ติชัน
ตารางที่แบ่งพาร์ติชันเป็นวิธีที่มีประสิทธิภาพในการจัดการตารางขนาดใหญ่ที่มีข้อมูลจำนวนมาก ตารางที่แบ่งพาร์ติชั่นเป็นตารางแยกส่วนที่กระจายไปทั่วพาร์ติชัน (ไดเร็กทอรี) มากขึ้น
ภายในแต่ละพาร์ติชันตารางจะมีไดเร็กทอรีของตัวเองโดยมีโครงสร้างของตารางแยกส่วน ตารางสามารถแบ่งเป็นวัน / เดือน / ปีเพื่อให้สามารถเข้าถึงเนื้อหาได้อย่างเหมาะสมที่สุด
ในการรับเนื้อหาของตารางที่แบ่งพาร์ติชันให้ใช้บล็อกรหัสต่อไปนี้ -
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 ….
มาลองรับเนื้อหาของตารางการค้า -
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 - โหมดแบ่งพาร์ติชันเหมาะสำหรับตารางที่มีบันทึกหลายล้านรายการต่อวัน (เช่นข้อมูลอนุกรมเวลา)
Sym
ไฟล์ sym เป็นไฟล์ไบนารี kdb + ที่มีรายการสัญลักษณ์จากตารางแยกและแบ่งพาร์ติชันทั้งหมด สามารถอ่านได้ด้วย
get `:sym
ไฟล์ par.txt (ทางเลือก)
นี่คือไฟล์คอนฟิกูเรชันที่ใช้เมื่อพาร์ติชันถูกกระจายบนไดเร็กทอรี / ดิสก์ไดรฟ์หลายตัวและมีพา ธ ไปยังพาร์ติชันดิสก์
.Q.en
.Q.enเป็นฟังก์ชัน dyadic ที่ช่วยในการแยกตารางโดยการแจกแจงคอลัมน์สัญลักษณ์ มีประโยชน์อย่างยิ่งเมื่อเราจัดการกับฐานข้อมูลในอดีต (สเปย์ตารางพาร์ติชัน ฯลฯ ) -
.Q.en[`:directory;table]
ที่ไหน directory เป็นโฮมไดเร็กทอรีของฐานข้อมูลประวัติที่ sym file ตั้งอยู่และ table คือตารางที่จะแจกแจง
การแจกแจงตารางด้วยตนเองไม่จำเป็นต้องบันทึกเป็นตารางแบบแยกส่วนเนื่องจากจะทำได้โดย -
.Q.en[`:directory_where_symbol_file_stored]table_name
.Q.dpft
.Q.dpftฟังก์ชันช่วยในการสร้างตารางแบ่งพาร์ติชันและแบ่งส่วน เป็นรูปแบบขั้นสูงของ.Q.enเนื่องจากไม่เพียง แต่แยกตาราง แต่ยังสร้างตารางพาร์ติชัน
มีสี่อาร์กิวเมนต์ที่ใช้ใน .Q.dpft -
ที่จับไฟล์สัญลักษณ์ของฐานข้อมูลที่เราต้องการสร้างพาร์ติชัน
q ค่าข้อมูลที่เราจะแบ่งตาราง
ชื่อของฟิลด์ที่จะนำแอตทริบิวต์ parted (`p #) ไปใช้ (โดยปกติจะเป็น` sym) และ
ชื่อตาราง
ลองมาดูตัวอย่างการทำงาน -
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
เราได้ลบตาราง tabจากหน่วยความจำ ตอนนี้ให้เราโหลดจาก 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 เป็นฟังก์ชัน monadic ที่มีพารามิเตอร์เดียวเป็นตัวจัดการไฟล์สัญลักษณ์ของไดเร็กทอรีราก สร้างตารางว่างในพาร์ติชันทุกที่ที่จำเป็นโดยการตรวจสอบไดเร็กทอรีย่อยแต่ละพาร์ติชันในรูท
.Q.chk `:directory
ที่ไหน directory เป็นโฮมไดเร็กทอรีของฐานข้อมูลประวัติ