Język Q - atrybuty

Do list, słowników lub kolumn tabeli można zastosować atrybuty. Atrybuty narzucają określone właściwości na liście. Niektóre atrybuty mogą zniknąć po modyfikacji.

Typy atrybutów

Posortowano (s #)

`s # oznacza, że ​​lista jest posortowana w porządku rosnącym. Jeśli lista jest jawnie posortowana według asc (lub xasc), lista automatycznie będzie miała ustawiony atrybut sortowania.

q)L1: asc 40 30 20 50 9 4

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

Lista, o której wiadomo, że jest sortowana, może również mieć jawnie ustawiony atrybut. Q sprawdzi, czy lista jest posortowana, a jeśli nie, to plik s-fail zostanie wyrzucony błąd.

q)L2:30 40 24 30 2

q)`s#L2
's-fail

Posortowany atrybut zostanie utracony po nieposortowanym dołączeniu.

Rozstanie (`p #)

`p # oznacza, że ​​lista jest podzielona i identyczne pozycje są przechowywane w sposób ciągły.

Zakres to int lub temporal type posiadanie bazowej wartości int, takiej jak lata, miesiące, dni itp. Możesz również podzielić symbol, pod warunkiem, że jest wyliczony.

Zastosowanie atrybutu parted powoduje utworzenie słownika indeksu, który odwzorowuje każdą unikalną wartość wyjściową na pozycję jej pierwszego wystąpienia. Gdy lista jest rozdzielana, wyszukiwanie jest znacznie szybsze, ponieważ wyszukiwanie liniowe jest zastępowane wyszukiwaniem z użyciem tablicy z haszowaniem.

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 −

  • Atrybut parted nie jest zachowywany w ramach operacji na liście, nawet jeśli operacja zachowuje partycjonowanie.

  • Atrybut rozdzielony należy brać pod uwagę, gdy liczba podmiotów sięga miliarda, a większość partycji ma znaczną wielkość, tj. Występuje znaczna liczba powtórzeń.

Zgrupowane (`g #)

`g # oznacza, że ​​lista jest zgrupowana. Tworzy się i utrzymuje wewnętrzny słownik, który odwzorowuje każdy unikalny element na każdy z jego indeksów, co wymaga znacznej przestrzeni dyskowej. Aby uzyskać listę długościL zawierający u unikalne rozmiary s, to będzie (L × 4) + (u × s) bajtów.

Grupowanie można zastosować do listy, gdy nie można poczynić żadnych innych założeń dotyczących jej struktury.

Atrybut można zastosować do dowolnych wpisanych list. Jest utrzymywany przy dołączaniu, ale tracony przy usuwaniu.

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

Unikalne (`#u)

Zastosowanie unikalnego atrybutu („u #) do listy wskazuje, że pozycje na liście są różne. Świadomość, że elementy listy są wyjątkowe, dramatycznie przyspieszadistinct i pozwala q aby wcześniej przeprowadzić pewne porównania.

Gdy lista jest oznaczona jako unikalna, dla każdego elementu na liście tworzona jest wewnętrzna mapa skrótów. Operacje na liście muszą zachować niepowtarzalność, w przeciwnym razie atrybut zostanie utracony.

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 # jest zachowywane w konkatenacjach, które zachowują wyjątkowość. Jest tracony w przypadku usunięć i nieunikalnych konkatenacji.

  • Przeszukiwanie list `u # odbywa się za pomocą funkcji skrótu.

Usuwanie atrybutów

Atrybuty można usunąć, stosując `` #.

Stosowanie atrybutów

Trzy formaty stosowania atrybutów to -

  • L: `s# 14 2 3 3 9/ Określ podczas tworzenia listy

  • @[ `.; `L ; `s#]/ Funkcjonalne, tzn. Do listy zmiennych L

    / w domyślnej przestrzeni nazw (tj.)

    / posortowany atrybut s #

  • Update `s#time from `tab

    / Zaktualizuj tabelę (kartę), aby zastosować

    / atrybut.

Zastosujmy powyższe trzy różne formaty z przykładami.

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#).