mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
DOCAPI-8530: Code blocks markup fix (#7060)
* Typo fix. * Links fix. * Fixed links in docs. * More fixes. * docs/en: cleaning some files * docs/en: cleaning data_types * docs/en: cleaning database_engines * docs/en: cleaning development * docs/en: cleaning getting_started * docs/en: cleaning interfaces * docs/en: cleaning operations * docs/en: cleaning query_lamguage * docs/en: cleaning en * docs/ru: cleaning data_types * docs/ru: cleaning index * docs/ru: cleaning database_engines * docs/ru: cleaning development * docs/ru: cleaning general * docs/ru: cleaning getting_started * docs/ru: cleaning interfaces * docs/ru: cleaning operations * docs/ru: cleaning query_language * docs: cleaning interfaces/http * Update docs/en/data_types/array.md decorated ``` Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/getting_started/example_datasets/nyc_taxi.md fixed typo Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/getting_started/example_datasets/ontime.md fixed typo Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/interfaces/formats.md fixed error Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/operations/table_engines/custom_partitioning_key.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/operations/utils/clickhouse-local.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/dicts/external_dicts_dict_sources.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/operations/utils/clickhouse-local.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/functions/json_functions.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/functions/json_functions.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/functions/other_functions.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/functions/other_functions.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/query_language/functions/date_time_functions.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * Update docs/en/operations/table_engines/jdbc.md Co-Authored-By: BayoNet <da-daos@yandex.ru> * docs: fixed error * docs: fixed error
This commit is contained in:
parent
016f3b0a45
commit
2d2bc052e1
@ -8,42 +8,34 @@ Array of `T`-type items.
|
||||
|
||||
You can use a function to create an array:
|
||||
|
||||
```
|
||||
```sql
|
||||
array(T)
|
||||
```
|
||||
|
||||
You can also use square brackets.
|
||||
|
||||
```
|
||||
```sql
|
||||
[]
|
||||
```
|
||||
|
||||
Example of creating an array:
|
||||
|
||||
```sql
|
||||
SELECT array(1, 2) AS x, toTypeName(x)
|
||||
```
|
||||
:) SELECT array(1, 2) AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```text
|
||||
┌─x─────┬─toTypeName(array(1, 2))─┐
|
||||
│ [1,2] │ Array(UInt8) │
|
||||
└───────┴─────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
|
||||
:) SELECT [1, 2] AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT [1, 2] AS x, toTypeName(x)
|
||||
```
|
||||
```text
|
||||
┌─x─────┬─toTypeName([1, 2])─┐
|
||||
│ [1,2] │ Array(UInt8) │
|
||||
└───────┴────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
## Working with data types
|
||||
@ -54,31 +46,23 @@ If ClickHouse couldn't determine the data type, it will generate an exception. F
|
||||
|
||||
Examples of automatic data type detection:
|
||||
|
||||
```sql
|
||||
SELECT array(1, 2, NULL) AS x, toTypeName(x)
|
||||
```
|
||||
:) SELECT array(1, 2, NULL) AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2, NULL] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```text
|
||||
┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
|
||||
│ [1,2,NULL] │ Array(Nullable(UInt8)) │
|
||||
└────────────┴───────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
If you try to create an array of incompatible data types, ClickHouse throws an exception:
|
||||
|
||||
```sql
|
||||
SELECT array(1, 'a')
|
||||
```
|
||||
:) SELECT array(1, 'a')
|
||||
|
||||
SELECT [1, 'a']
|
||||
|
||||
```text
|
||||
Received exception from server (version 1.1.54388):
|
||||
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.
|
||||
|
||||
0 rows in set. Elapsed: 0.246 sec.
|
||||
```
|
||||
|
||||
|
||||
|
@ -51,36 +51,36 @@ Some functions on Decimal return result as Float64 (for example, var or stddev).
|
||||
|
||||
During calculations on Decimal, integer overflows might happen. Excessive digits in fraction are discarded (not rounded). Excessive digits in integer part will lead to exception.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(2, 4) AS x, x / 3
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐
|
||||
│ 2.0000 │ 0.6666 │
|
||||
└────────┴──────────────────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(4.2, 8) AS x, x * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Scale is out of bounds.
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Decimal math overflow.
|
||||
```
|
||||
|
||||
Overflow checks lead to operations slowdown. If it is known that overflows are not possible, it makes sense to disable checks using `decimal_check_overflow` setting. When checks are disabled and overflow happens, the result will be incorrect:
|
||||
|
||||
```
|
||||
```sql
|
||||
SET decimal_check_overflow = 0;
|
||||
SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐
|
||||
│ 4.20000000 │ -17.74967296 │
|
||||
└────────────┴──────────────────────────────────┘
|
||||
@ -88,10 +88,10 @@ SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
|
||||
Overflow checks happen not only on arithmetic operations, but also on value comparison:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(1, 8) < 100
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Can't compare.
|
||||
```
|
||||
|
||||
|
@ -10,7 +10,7 @@ CREATE TABLE hits (url String, from IPv4) ENGINE = MergeTree() ORDER BY url;
|
||||
DESCRIBE TABLE hits;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐
|
||||
│ url │ String │ │ │ │ │
|
||||
│ from │ IPv4 │ │ │ │ │
|
||||
@ -31,7 +31,7 @@ INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '116.253.40.133')(
|
||||
SELECT * FROM hits;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─url────────────────────────────────┬───────────from─┐
|
||||
│ https://clickhouse.yandex/docs/en/ │ 116.106.34.242 │
|
||||
│ https://wikipedia.org │ 116.253.40.133 │
|
||||
@ -45,7 +45,7 @@ Values are stored in compact binary form:
|
||||
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(from)─┬─hex(from)─┐
|
||||
│ IPv4 │ B7F7E83A │
|
||||
└──────────────────┴───────────┘
|
||||
@ -70,7 +70,7 @@ Or cast to a `UInt32` value:
|
||||
SELECT toTypeName(i), CAST(from as UInt32) as i FROM hits LIMIT 1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(CAST(from, 'UInt32'))─┬──────────i─┐
|
||||
│ UInt32 │ 3086477370 │
|
||||
└──────────────────────────────────┴────────────┘
|
||||
|
@ -10,7 +10,7 @@ CREATE TABLE hits (url String, from IPv6) ENGINE = MergeTree() ORDER BY url;
|
||||
DESCRIBE TABLE hits;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┐
|
||||
│ url │ String │ │ │ │ │
|
||||
│ from │ IPv6 │ │ │ │ │
|
||||
@ -31,7 +31,7 @@ INSERT INTO hits (url, from) VALUES ('https://wikipedia.org', '2a02:aa08:e000:31
|
||||
SELECT * FROM hits;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─url────────────────────────────────┬─from──────────────────────────┐
|
||||
│ https://clickhouse.yandex │ 2001:44c8:129:2632:33:0:252:2 │
|
||||
│ https://clickhouse.yandex/docs/en/ │ 2a02:e980:1e::1 │
|
||||
@ -45,7 +45,7 @@ Values are stored in compact binary form:
|
||||
SELECT toTypeName(from), hex(from) FROM hits LIMIT 1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(from)─┬─hex(from)────────────────────────┐
|
||||
│ IPv6 │ 200144C8012926320033000002520002 │
|
||||
└──────────────────┴──────────────────────────────────┘
|
||||
@ -58,7 +58,7 @@ If you want to convert `IPv6` value to a string, you have to do that explicitly
|
||||
SELECT toTypeName(s), IPv6NumToString(from) as s FROM hits LIMIT 1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(IPv6NumToString(from))─┬─s─────────────────────────────┐
|
||||
│ String │ 2001:44c8:129:2632:33:0:252:2 │
|
||||
└───────────────────────────────────┴───────────────────────────────┘
|
||||
@ -70,7 +70,7 @@ Or cast to a `FixedString(16)` value:
|
||||
SELECT toTypeName(i), CAST(from as FixedString(16)) as i FROM hits LIMIT 1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(CAST(from, 'FixedString(16)'))─┬─i───────┐
|
||||
│ FixedString(16) │ <20><><EFBFBD> │
|
||||
└───────────────────────────────────────────┴─────────┘
|
||||
|
@ -26,19 +26,15 @@ ENGINE = TinyLog
|
||||
Column `x` can only store values that are listed in the type definition: `'hello'` or `'world'`. If you try to save any other value, ClickHouse will raise an exception. 8-bit size for this `Enum` is chosen automatically.
|
||||
|
||||
```sql
|
||||
:) INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
|
||||
|
||||
INSERT INTO t_enum VALUES
|
||||
|
||||
INSERT INTO t_enum VALUES ('hello'), ('world'), ('hello')
|
||||
```
|
||||
```text
|
||||
Ok.
|
||||
|
||||
3 rows in set. Elapsed: 0.002 sec.
|
||||
|
||||
:) insert into t_enum values('a')
|
||||
|
||||
INSERT INTO t_enum VALUES
|
||||
|
||||
|
||||
```
|
||||
```sql
|
||||
INSERT INTO t_enum values('a')
|
||||
```
|
||||
```text
|
||||
Exception on client:
|
||||
Code: 49. DB::Exception: Unknown element 'a' for type Enum('hello' = 1, 'world' = 2)
|
||||
```
|
||||
@ -47,7 +43,8 @@ When you query data from the table, ClickHouse outputs the string values from `E
|
||||
|
||||
```sql
|
||||
SELECT * FROM t_enum
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─────┐
|
||||
│ hello │
|
||||
│ world │
|
||||
@ -59,7 +56,8 @@ If you need to see the numeric equivalents of the rows, you must cast the `Enum`
|
||||
|
||||
```sql
|
||||
SELECT CAST(x, 'Int8') FROM t_enum
|
||||
|
||||
```
|
||||
```text
|
||||
┌─CAST(x, 'Int8')─┐
|
||||
│ 1 │
|
||||
│ 2 │
|
||||
@ -71,7 +69,8 @@ To create an Enum value in a query, you also need to use `CAST`.
|
||||
|
||||
```sql
|
||||
SELECT toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(CAST('a', 'Enum(\'a\' = 1, \'b\' = 2)'))─┐
|
||||
│ Enum8('a' = 1, 'b' = 2) │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
@ -85,7 +84,7 @@ Neither the string nor the numeric value in an `Enum` can be [NULL](../query_lan
|
||||
|
||||
An `Enum` can be contained in [Nullable](nullable.md) type. So if you create a table using the query
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE t_enum_nullable
|
||||
(
|
||||
x Nullable( Enum8('hello' = 1, 'world' = 2) )
|
||||
@ -95,7 +94,7 @@ ENGINE = TinyLog
|
||||
|
||||
it can store not only `'hello'` and `'world'`, but `NULL`, as well.
|
||||
|
||||
```
|
||||
```sql
|
||||
INSERT INTO t_enum_nullable Values('hello'),('world'),(NULL)
|
||||
```
|
||||
|
||||
|
@ -4,7 +4,7 @@ A fixed-length string of `N` bytes (neither characters nor code points).
|
||||
|
||||
To declare a column of `FixedString` type, use the following syntax:
|
||||
|
||||
```
|
||||
```sql
|
||||
<column_name> FixedString(N)
|
||||
```
|
||||
|
||||
@ -30,7 +30,7 @@ When selecting the data, ClickHouse does not remove the null bytes at the end of
|
||||
|
||||
Let's consider the following table with the single `FixedString(2)` column:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name──┐
|
||||
│ b │
|
||||
└───────┘
|
||||
@ -38,15 +38,14 @@ Let's consider the following table with the single `FixedString(2)` column:
|
||||
|
||||
The query `SELECT * FROM FixedStringTable WHERE a = 'b'` does not return any data as a result. We should complement the filter pattern with null bytes.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM FixedStringTable
|
||||
WHERE a = 'b\0'
|
||||
|
||||
```
|
||||
```text
|
||||
┌─a─┐
|
||||
│ b │
|
||||
└───┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
This behavior differs from MySQL behavior for the `CHAR` type (where strings are padded with spaces, and the spaces are removed for output).
|
||||
|
@ -17,7 +17,7 @@ We recommend that you store data in integer form whenever possible. For example,
|
||||
SELECT 1 - 0.9
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────minus(1, 0.9)─┐
|
||||
│ 0.09999999999999998 │
|
||||
└─────────────────────┘
|
||||
@ -37,7 +37,7 @@ In contrast to standard SQL, ClickHouse supports the following categories of flo
|
||||
SELECT 0.5 / 0
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─divide(0.5, 0)─┐
|
||||
│ inf │
|
||||
└────────────────┘
|
||||
@ -49,7 +49,7 @@ SELECT 0.5 / 0
|
||||
SELECT -0.5 / 0
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─divide(-0.5, 0)─┐
|
||||
│ -inf │
|
||||
└─────────────────┘
|
||||
@ -57,11 +57,11 @@ SELECT -0.5 / 0
|
||||
|
||||
- `NaN` – Not a number.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT 0 / 0
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─divide(0, 0)─┐
|
||||
│ nan │
|
||||
└──────────────┘
|
||||
|
@ -33,7 +33,7 @@ To insert data, use `INSERT SELECT` with aggregate `-State`- functions.
|
||||
|
||||
**Function examples**
|
||||
|
||||
```
|
||||
```sql
|
||||
uniqState(UserID)
|
||||
quantilesState(0.5, 0.9)(SendTiming)
|
||||
```
|
||||
|
@ -44,7 +44,7 @@ WHERE CounterID = 101500 AND length(Goals.ID) < 5
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
|
||||
│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │
|
||||
│ [1073752] │ ['2014-03-17 00:28:25'] │
|
||||
@ -73,7 +73,7 @@ WHERE CounterID = 101500 AND length(Goals.ID) < 5
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─Goal.ID─┬──────Goal.EventTime─┐
|
||||
│ 1073752 │ 2014-03-17 16:38:10 │
|
||||
│ 591325 │ 2014-03-17 16:38:48 │
|
||||
|
@ -17,39 +17,20 @@ To store `Nullable` type values in table column, ClickHouse uses a separate file
|
||||
|
||||
## Usage example
|
||||
|
||||
```sql
|
||||
CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
|
||||
```
|
||||
:) CREATE TABLE t_null(x Int8, y Nullable(Int8)) ENGINE TinyLog
|
||||
|
||||
CREATE TABLE t_null
|
||||
(
|
||||
x Int8,
|
||||
y Nullable(Int8)
|
||||
)
|
||||
ENGINE = TinyLog
|
||||
|
||||
Ok.
|
||||
|
||||
0 rows in set. Elapsed: 0.012 sec.
|
||||
|
||||
:) INSERT INTO t_null VALUES (1, NULL), (2, 3)
|
||||
|
||||
INSERT INTO t_null VALUES
|
||||
|
||||
Ok.
|
||||
|
||||
1 rows in set. Elapsed: 0.007 sec.
|
||||
|
||||
:) SELECT x + y FROM t_null
|
||||
|
||||
SELECT x + y
|
||||
FROM t_null
|
||||
|
||||
```sql
|
||||
INSERT INTO t_null VALUES (1, NULL), (2, 3)
|
||||
```
|
||||
```sql
|
||||
SELECT x + y FROM t_null
|
||||
```
|
||||
```text
|
||||
┌─plus(x, y)─┐
|
||||
│ ᴺᵁᴸᴸ │
|
||||
│ 5 │
|
||||
└────────────┘
|
||||
|
||||
2 rows in set. Elapsed: 0.144 sec.
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/data_types/nullable/) <!--hide-->
|
||||
|
@ -7,16 +7,13 @@ For example, literal [NULL](../../query_language/syntax.md#null-literal) has typ
|
||||
|
||||
The `Nothing` type can also used to denote empty arrays:
|
||||
|
||||
```bash
|
||||
:) SELECT toTypeName(array())
|
||||
|
||||
SELECT toTypeName([])
|
||||
|
||||
```sql
|
||||
SELECT toTypeName(array())
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(array())─┐
|
||||
│ Array(Nothing) │
|
||||
└─────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.062 sec.
|
||||
```
|
||||
|
||||
|
||||
|
@ -11,24 +11,19 @@ Tuples can be the result of a query. In this case, for text formats other than J
|
||||
|
||||
You can use a function to create a tuple:
|
||||
|
||||
```
|
||||
```sql
|
||||
tuple(T1, T2, ...)
|
||||
```
|
||||
|
||||
Example of creating a tuple:
|
||||
|
||||
```sql
|
||||
SELECT tuple(1,'a') AS x, toTypeName(x)
|
||||
```
|
||||
:) SELECT tuple(1,'a') AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
(1, 'a') AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```text
|
||||
┌─x───────┬─toTypeName(tuple(1, 'a'))─┐
|
||||
│ (1,'a') │ Tuple(UInt8, String) │
|
||||
└─────────┴───────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.021 sec.
|
||||
```
|
||||
|
||||
## Working with data types
|
||||
@ -37,18 +32,13 @@ When creating a tuple on the fly, ClickHouse automatically detects the type of e
|
||||
|
||||
Example of automatic data type detection:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT tuple(1, NULL) AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
(1, NULL) AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x────────┬─toTypeName(tuple(1, NULL))──────┐
|
||||
│ (1,NULL) │ Tuple(UInt8, Nullable(Nothing)) │
|
||||
└──────────┴─────────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
|
||||
|
@ -4,13 +4,13 @@ A universally unique identifier (UUID) is a 16-byte number used to identify reco
|
||||
|
||||
The example of UUID type value is represented below:
|
||||
|
||||
```
|
||||
```text
|
||||
61f0c404-5cb3-11e7-907b-a6006ad3dba0
|
||||
```
|
||||
|
||||
If you do not specify the UUID column value when inserting a new record, the UUID value is filled with zero:
|
||||
|
||||
```
|
||||
```text
|
||||
00000000-0000-0000-0000-000000000000
|
||||
```
|
||||
|
||||
@ -25,12 +25,15 @@ To generate the UUID value, ClickHouse provides the [generateUUIDv4](../query_la
|
||||
This example demonstrates creating a table with the UUID type column and inserting a value into the table.
|
||||
|
||||
```sql
|
||||
:) CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog
|
||||
|
||||
:) INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1'
|
||||
|
||||
:) SELECT * FROM t_uuid
|
||||
|
||||
CREATE TABLE t_uuid (x UUID, y String) ENGINE=TinyLog
|
||||
```
|
||||
```sql
|
||||
INSERT INTO t_uuid SELECT generateUUIDv4(), 'Example 1'
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM t_uuid
|
||||
```
|
||||
```text
|
||||
┌────────────────────────────────────x─┬─y─────────┐
|
||||
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
|
||||
└──────────────────────────────────────┴───────────┘
|
||||
@ -41,10 +44,12 @@ This example demonstrates creating a table with the UUID type column and inserti
|
||||
In this example, the UUID column value is not specified when inserting a new record.
|
||||
|
||||
```sql
|
||||
:) INSERT INTO t_uuid (y) VALUES ('Example 2')
|
||||
|
||||
:) SELECT * FROM t_uuid
|
||||
|
||||
INSERT INTO t_uuid (y) VALUES ('Example 2')
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM t_uuid
|
||||
```
|
||||
```text
|
||||
┌────────────────────────────────────x─┬─y─────────┐
|
||||
│ 417ddc5d-e556-4d27-95dd-a34d84e46a50 │ Example 1 │
|
||||
│ 00000000-0000-0000-0000-000000000000 │ Example 2 │
|
||||
|
@ -55,7 +55,7 @@ All other MySQL data types are converted into [String](../data_types/string.md).
|
||||
|
||||
Table in MySQL:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> USE test;
|
||||
Database changed
|
||||
|
||||
|
@ -3,21 +3,21 @@
|
||||
## Install Git and Pbuilder
|
||||
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install git pbuilder debhelper lsb-release fakeroot sudo debian-archive-keyring debian-keyring
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install git pbuilder debhelper lsb-release fakeroot sudo debian-archive-keyring debian-keyring
|
||||
```
|
||||
|
||||
## Checkout ClickHouse Sources
|
||||
|
||||
```bash
|
||||
git clone --recursive --branch stable https://github.com/yandex/ClickHouse.git
|
||||
cd ClickHouse
|
||||
$ git clone --recursive --branch stable https://github.com/yandex/ClickHouse.git
|
||||
$ cd ClickHouse
|
||||
```
|
||||
|
||||
## Run Release Script
|
||||
|
||||
```bash
|
||||
./release
|
||||
$ ./release
|
||||
```
|
||||
|
||||
# How to Build ClickHouse for Development
|
||||
@ -29,13 +29,13 @@ Only x86_64 with SSE 4.2 is supported. Support for AArch64 is experimental.
|
||||
To test for SSE 4.2, do
|
||||
|
||||
```bash
|
||||
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
|
||||
$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
|
||||
```
|
||||
|
||||
## Install Git and CMake
|
||||
|
||||
```bash
|
||||
sudo apt-get install git cmake ninja-build
|
||||
$ sudo apt-get install git cmake ninja-build
|
||||
```
|
||||
|
||||
Or cmake3 instead of cmake on older systems.
|
||||
@ -47,10 +47,10 @@ There are several ways to do this.
|
||||
### Install from a PPA Package
|
||||
|
||||
```bash
|
||||
sudo apt-get install software-properties-common
|
||||
sudo apt-add-repository ppa:ubuntu-toolchain-r/test
|
||||
sudo apt-get update
|
||||
sudo apt-get install gcc-9 g++-9
|
||||
$ sudo apt-get install software-properties-common
|
||||
$ sudo apt-add-repository ppa:ubuntu-toolchain-r/test
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install gcc-9 g++-9
|
||||
```
|
||||
|
||||
### Install from Sources
|
||||
@ -60,23 +60,25 @@ Look at [utils/ci/build-gcc-from-sources.sh](https://github.com/yandex/ClickHous
|
||||
## Use GCC 9 for Builds
|
||||
|
||||
```bash
|
||||
export CC=gcc-9
|
||||
export CXX=g++-9
|
||||
$ export CC=gcc-9
|
||||
$ export CXX=g++-9
|
||||
```
|
||||
|
||||
## Install Required Libraries from Packages
|
||||
|
||||
```bash
|
||||
sudo apt-get install libicu-dev libreadline-dev gperf
|
||||
$ sudo apt-get install libicu-dev libreadline-dev gperf
|
||||
```
|
||||
|
||||
## Checkout ClickHouse Sources
|
||||
|
||||
```bash
|
||||
git clone --recursive git@github.com:yandex/ClickHouse.git
|
||||
# or: git clone --recursive https://github.com/yandex/ClickHouse.git
|
||||
|
||||
cd ClickHouse
|
||||
$ git clone --recursive git@github.com:yandex/ClickHouse.git
|
||||
```
|
||||
or
|
||||
```bash
|
||||
$ git clone --recursive https://github.com/yandex/ClickHouse.git
|
||||
$ cd ClickHouse
|
||||
```
|
||||
|
||||
For the latest stable version, switch to the `stable` branch.
|
||||
@ -84,11 +86,11 @@ For the latest stable version, switch to the `stable` branch.
|
||||
## Build ClickHouse
|
||||
|
||||
```bash
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ..
|
||||
ninja
|
||||
cd ..
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake ..
|
||||
$ ninja
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
To create an executable, run `ninja clickhouse`.
|
||||
|
@ -5,22 +5,25 @@ Build should work on Mac OS X 10.12.
|
||||
## Install Homebrew
|
||||
|
||||
```bash
|
||||
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
|
||||
```
|
||||
|
||||
## Install Required Compilers, Tools, and Libraries
|
||||
|
||||
```bash
|
||||
brew install cmake ninja gcc icu4c openssl libtool gettext readline gperf
|
||||
$ brew install cmake ninja gcc icu4c openssl libtool gettext readline gperf
|
||||
```
|
||||
|
||||
## Checkout ClickHouse Sources
|
||||
|
||||
```bash
|
||||
git clone --recursive git@github.com:yandex/ClickHouse.git
|
||||
# or: git clone --recursive https://github.com/yandex/ClickHouse.git
|
||||
$ git clone --recursive git@github.com:yandex/ClickHouse.git
|
||||
```
|
||||
or
|
||||
```bash
|
||||
$ git clone --recursive https://github.com/yandex/ClickHouse.git
|
||||
|
||||
cd ClickHouse
|
||||
$ cd ClickHouse
|
||||
```
|
||||
|
||||
For the latest stable version, switch to the `stable` branch.
|
||||
@ -28,11 +31,11 @@ For the latest stable version, switch to the `stable` branch.
|
||||
## Build ClickHouse
|
||||
|
||||
```bash
|
||||
mkdir build
|
||||
cd build
|
||||
cmake .. -DCMAKE_CXX_COMPILER=`which g++-8` -DCMAKE_C_COMPILER=`which gcc-8`
|
||||
ninja
|
||||
cd ..
|
||||
$ mkdir build
|
||||
$ cd build
|
||||
$ cmake .. -DCMAKE_CXX_COMPILER=`which g++-8` -DCMAKE_C_COMPILER=`which gcc-8`
|
||||
$ ninja
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
## Caveats
|
||||
|
@ -86,21 +86,21 @@ Note that all clickhouse tools (server, client, etc) are just symlinks to a sing
|
||||
Alternatively you can install ClickHouse package: either stable release from Yandex repository or you can build package for yourself with `./release` in ClickHouse sources root. Then start the server with `sudo service clickhouse-server start` (or stop to stop the server). Look for logs at `/etc/clickhouse-server/clickhouse-server.log`.
|
||||
|
||||
When ClickHouse is already installed on your system, you can build a new `clickhouse` binary and replace the existing binary:
|
||||
```
|
||||
sudo service clickhouse-server stop
|
||||
sudo cp ./clickhouse /usr/bin/
|
||||
sudo service clickhouse-server start
|
||||
```bash
|
||||
$ sudo service clickhouse-server stop
|
||||
$ sudo cp ./clickhouse /usr/bin/
|
||||
$ sudo service clickhouse-server start
|
||||
```
|
||||
|
||||
Also you can stop system clickhouse-server and run your own with the same configuration but with logging to terminal:
|
||||
```
|
||||
sudo service clickhouse-server stop
|
||||
sudo -u clickhouse /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```bash
|
||||
$ sudo service clickhouse-server stop
|
||||
$ sudo -u clickhouse /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```
|
||||
|
||||
Example with gdb:
|
||||
```
|
||||
sudo -u clickhouse gdb --args /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```bash
|
||||
$ sudo -u clickhouse gdb --args /usr/bin/clickhouse server --config-file /etc/clickhouse-server/config.xml
|
||||
```
|
||||
|
||||
If the system clickhouse-server is already running and you don't want to stop it, you can change port numbers in your `config.xml` (or override them in a file in `config.d` directory), provide appropriate data path, and run it.
|
||||
@ -112,7 +112,7 @@ If the system clickhouse-server is already running and you don't want to stop it
|
||||
|
||||
Before publishing release as stable we deploy it on testing environment. Testing environment is a cluster that process 1/39 part of [Yandex.Metrica](https://metrica.yandex.com/) data. We share our testing environment with Yandex.Metrica team. ClickHouse is upgraded without downtime on top of existing data. We look at first that data is processed successfully without lagging from realtime, the replication continue to work and there is no issues visible to Yandex.Metrica team. First check can be done in the following way:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT hostName() AS h, any(version()), any(uptime()), max(UTCEventTime), count() FROM remote('example01-01-{1..3}t', merge, hits) WHERE EventDate >= today() - 2 GROUP BY h ORDER BY h;
|
||||
```
|
||||
|
||||
@ -126,16 +126,16 @@ After deploying to testing environment we run load testing with queries from pro
|
||||
Make sure you have enabled `query_log` on your production cluster.
|
||||
|
||||
Collect query log for a day or more:
|
||||
```
|
||||
clickhouse-client --query="SELECT DISTINCT query FROM system.query_log WHERE event_date = today() AND query LIKE '%ym:%' AND query NOT LIKE '%system.query_log%' AND type = 2 AND is_initial_query" > queries.tsv
|
||||
```bash
|
||||
$ clickhouse-client --query="SELECT DISTINCT query FROM system.query_log WHERE event_date = today() AND query LIKE '%ym:%' AND query NOT LIKE '%system.query_log%' AND type = 2 AND is_initial_query" > queries.tsv
|
||||
```
|
||||
|
||||
This is a way complicated example. `type = 2` will filter queries that are executed successfully. `query LIKE '%ym:%'` is to select relevant queries from Yandex.Metrica. `is_initial_query` is to select only queries that are initiated by client, not by ClickHouse itself (as parts of distributed query processing).
|
||||
|
||||
`scp` this log to your testing cluster and run it as following:
|
||||
|
||||
```
|
||||
clickhouse benchmark --concurrency 16 < queries.tsv
|
||||
```bash
|
||||
$ clickhouse benchmark --concurrency 16 < queries.tsv
|
||||
```
|
||||
(probably you also want to specify a `--user`)
|
||||
|
||||
|
@ -17,7 +17,7 @@ If you use Oracle through the ODBC driver as a source of external dictionaries,
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
NLS_LANG=RUSSIAN_RUSSIA.UTF8
|
||||
```
|
||||
|
||||
|
@ -7,16 +7,16 @@ Sign up for a free account at <https://aws.amazon.com>. You will need a credit c
|
||||
Run the following in the console:
|
||||
|
||||
```bash
|
||||
sudo apt-get install s3cmd
|
||||
mkdir tiny; cd tiny;
|
||||
s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/tiny/ .
|
||||
cd ..
|
||||
mkdir 1node; cd 1node;
|
||||
s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/1node/ .
|
||||
cd ..
|
||||
mkdir 5nodes; cd 5nodes;
|
||||
s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/5nodes/ .
|
||||
cd ..
|
||||
$ sudo apt-get install s3cmd
|
||||
$ mkdir tiny; cd tiny;
|
||||
$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/tiny/ .
|
||||
$ cd ..
|
||||
$ mkdir 1node; cd 1node;
|
||||
$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/1node/ .
|
||||
$ cd ..
|
||||
$ mkdir 5nodes; cd 5nodes;
|
||||
$ s3cmd sync s3://big-data-benchmark/pavlo/text-deflate/5nodes/ .
|
||||
$ cd ..
|
||||
```
|
||||
|
||||
Run the following ClickHouse queries:
|
||||
@ -86,12 +86,12 @@ CREATE TABLE uservisits_5nodes_on_single
|
||||
Go back to the console:
|
||||
|
||||
```bash
|
||||
for i in tiny/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_tiny FORMAT CSV"; done
|
||||
for i in tiny/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_tiny FORMAT CSV"; done
|
||||
for i in 1node/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_1node FORMAT CSV"; done
|
||||
for i in 1node/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_1node FORMAT CSV"; done
|
||||
for i in 5nodes/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_5nodes_on_single FORMAT CSV"; done
|
||||
for i in 5nodes/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_5nodes_on_single FORMAT CSV"; done
|
||||
$ for i in tiny/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_tiny FORMAT CSV"; done
|
||||
$ for i in tiny/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_tiny FORMAT CSV"; done
|
||||
$ for i in 1node/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_1node FORMAT CSV"; done
|
||||
$ for i in 1node/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_1node FORMAT CSV"; done
|
||||
$ for i in 5nodes/rankings/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO rankings_5nodes_on_single FORMAT CSV"; done
|
||||
$ for i in 5nodes/uservisits/*.deflate; do echo $i; zlib-flate -uncompress < $i | clickhouse-client --host=example-perftest01j --query="INSERT INTO uservisits_5nodes_on_single FORMAT CSV"; done
|
||||
```
|
||||
|
||||
Queries for obtaining data samples:
|
||||
|
@ -11,7 +11,7 @@ CREATE TABLE criteo_log (date Date, clicked UInt8, int1 Int32, int2 Int32, int3
|
||||
Download the data:
|
||||
|
||||
```bash
|
||||
for i in {00..23}; do echo $i; zcat datasets/criteo/day_${i#0}.gz | sed -r 's/^/2000-01-'${i/00/24}'\t/' | clickhouse-client --host=example-perftest01j --query="INSERT INTO criteo_log FORMAT TabSeparated"; done
|
||||
$ for i in {00..23}; do echo $i; zcat datasets/criteo/day_${i#0}.gz | sed -r 's/^/2000-01-'${i/00/24}'\t/' | clickhouse-client --host=example-perftest01j --query="INSERT INTO criteo_log FORMAT TabSeparated"; done
|
||||
```
|
||||
|
||||
Create a table for the converted data:
|
||||
|
@ -4,47 +4,47 @@ Dataset consists of two tables containing anonymized data about hits (`hits_v1`)
|
||||
## Obtaining Tables from Prepared Partitions
|
||||
**Download and import hits:**
|
||||
```bash
|
||||
curl -O https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits_v1.tar
|
||||
tar xvf hits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
# check permissions on unpacked data, fix if required
|
||||
sudo service clickhouse-server restart
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1"
|
||||
$ curl -O https://clickhouse-datasets.s3.yandex.net/hits/partitions/hits_v1.tar
|
||||
$ tar xvf hits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
$ # check permissions on unpacked data, fix if required
|
||||
$ sudo service clickhouse-server restart
|
||||
$ clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1"
|
||||
```
|
||||
|
||||
**Download and import visits:**
|
||||
```bash
|
||||
curl -O https://clickhouse-datasets.s3.yandex.net/visits/partitions/visits_v1.tar
|
||||
tar xvf visits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
# check permissions on unpacked data, fix if required
|
||||
sudo service clickhouse-server restart
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1"
|
||||
$ curl -O https://clickhouse-datasets.s3.yandex.net/visits/partitions/visits_v1.tar
|
||||
$ tar xvf visits_v1.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
$ # check permissions on unpacked data, fix if required
|
||||
$ sudo service clickhouse-server restart
|
||||
$ clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1"
|
||||
```
|
||||
|
||||
## Obtaining Tables from Compressed tsv-file
|
||||
**Download and import hits from compressed tsv-file**
|
||||
```bash
|
||||
curl https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
|
||||
# now create table
|
||||
clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets"
|
||||
clickhouse-client --query "CREATE TABLE datasets.hits_v1 ( WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, URLDomain String, RefererDomain String, Refresh UInt8, IsRobot UInt8, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), ResolutionWidth UInt16, ResolutionHeight UInt16, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, FlashMinor2 String, NetMajor UInt8, NetMinor UInt8, UserAgentMajor UInt16, UserAgentMinor FixedString(2), CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, MobilePhone UInt8, MobilePhoneModel String, Params String, IPNetworkID UInt32, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, IsArtifical UInt8, WindowClientWidth UInt16, WindowClientHeight UInt16, ClientTimeZone Int16, ClientEventTime DateTime, SilverlightVersion1 UInt8, SilverlightVersion2 UInt8, SilverlightVersion3 UInt32, SilverlightVersion4 UInt16, PageCharset String, CodeVersion UInt32, IsLink UInt8, IsDownload UInt8, IsNotBounce UInt8, FUniqID UInt64, HID UInt32, IsOldCounter UInt8, IsEvent UInt8, IsParameter UInt8, DontCountHits UInt8, WithHash UInt8, HitColor FixedString(1), UTCEventTime DateTime, Age UInt8, Sex UInt8, Income UInt8, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), RemoteIP UInt32, RemoteIP6 FixedString(16), WindowName Int32, OpenerName Int32, HistoryLength Int16, BrowserLanguage FixedString(2), BrowserCountry FixedString(2), SocialNetwork String, SocialAction String, HTTPError UInt16, SendTiming Int32, DNSTiming Int32, ConnectTiming Int32, ResponseStartTiming Int32, ResponseEndTiming Int32, FetchTiming Int32, RedirectTiming Int32, DOMInteractiveTiming Int32, DOMContentLoadedTiming Int32, DOMCompleteTiming Int32, LoadEventStartTiming Int32, LoadEventEndTiming Int32, NSToDOMContentLoadedTiming Int32, FirstPaintTiming Int32, RedirectCount Int8, SocialSourceNetworkID UInt8, SocialSourcePage String, ParamPrice Int64, ParamOrderID String, ParamCurrency FixedString(3), ParamCurrencyID UInt16, GoalsReached Array(UInt32), OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, RefererHash UInt64, URLHash UInt64, CLID UInt32, YCLID UInt64, ShareService String, ShareURL String, ShareTitle String, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), IslandID FixedString(16), RequestNum UInt32, RequestTry UInt8) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192"
|
||||
# import data
|
||||
cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000
|
||||
# optionally you can optimize table
|
||||
clickhouse-client --query "OPTIMIZE TABLE datasets.hits_v1 FINAL"
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1"
|
||||
$ curl https://clickhouse-datasets.s3.yandex.net/hits/tsv/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
|
||||
$ # now create table
|
||||
$ clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets"
|
||||
$ clickhouse-client --query "CREATE TABLE datasets.hits_v1 ( WatchID UInt64, JavaEnable UInt8, Title String, GoodEvent Int16, EventTime DateTime, EventDate Date, CounterID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RegionID UInt32, UserID UInt64, CounterClass Int8, OS UInt8, UserAgent UInt8, URL String, Referer String, URLDomain String, RefererDomain String, Refresh UInt8, IsRobot UInt8, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), ResolutionWidth UInt16, ResolutionHeight UInt16, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, FlashMinor2 String, NetMajor UInt8, NetMinor UInt8, UserAgentMajor UInt16, UserAgentMinor FixedString(2), CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, MobilePhone UInt8, MobilePhoneModel String, Params String, IPNetworkID UInt32, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, IsArtifical UInt8, WindowClientWidth UInt16, WindowClientHeight UInt16, ClientTimeZone Int16, ClientEventTime DateTime, SilverlightVersion1 UInt8, SilverlightVersion2 UInt8, SilverlightVersion3 UInt32, SilverlightVersion4 UInt16, PageCharset String, CodeVersion UInt32, IsLink UInt8, IsDownload UInt8, IsNotBounce UInt8, FUniqID UInt64, HID UInt32, IsOldCounter UInt8, IsEvent UInt8, IsParameter UInt8, DontCountHits UInt8, WithHash UInt8, HitColor FixedString(1), UTCEventTime DateTime, Age UInt8, Sex UInt8, Income UInt8, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), RemoteIP UInt32, RemoteIP6 FixedString(16), WindowName Int32, OpenerName Int32, HistoryLength Int16, BrowserLanguage FixedString(2), BrowserCountry FixedString(2), SocialNetwork String, SocialAction String, HTTPError UInt16, SendTiming Int32, DNSTiming Int32, ConnectTiming Int32, ResponseStartTiming Int32, ResponseEndTiming Int32, FetchTiming Int32, RedirectTiming Int32, DOMInteractiveTiming Int32, DOMContentLoadedTiming Int32, DOMCompleteTiming Int32, LoadEventStartTiming Int32, LoadEventEndTiming Int32, NSToDOMContentLoadedTiming Int32, FirstPaintTiming Int32, RedirectCount Int8, SocialSourceNetworkID UInt8, SocialSourcePage String, ParamPrice Int64, ParamOrderID String, ParamCurrency FixedString(3), ParamCurrencyID UInt16, GoalsReached Array(UInt32), OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, RefererHash UInt64, URLHash UInt64, CLID UInt32, YCLID UInt64, ShareService String, ShareURL String, ShareTitle String, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), IslandID FixedString(16), RequestNum UInt32, RequestTry UInt8) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192"
|
||||
$ # import data
|
||||
$ cat hits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.hits_v1 FORMAT TSV" --max_insert_block_size=100000
|
||||
$ # optionally you can optimize table
|
||||
$ clickhouse-client --query "OPTIMIZE TABLE datasets.hits_v1 FINAL"
|
||||
$ clickhouse-client --query "SELECT COUNT(*) FROM datasets.hits_v1"
|
||||
```
|
||||
|
||||
**Download and import visits from compressed tsv-file**
|
||||
```bash
|
||||
curl https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv
|
||||
# now create table
|
||||
clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets"
|
||||
clickhouse-client --query "CREATE TABLE datasets.visits_v1 ( CounterID UInt32, StartDate Date, Sign Int8, IsNew UInt8, VisitID UInt64, UserID UInt64, StartTime DateTime, Duration UInt32, UTCStartTime DateTime, PageViews Int32, Hits Int32, IsBounce UInt8, Referer String, StartURL String, RefererDomain String, StartURLDomain String, EndURL String, LinkURL String, IsDownload UInt8, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, PlaceID Int32, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), IsYandex UInt8, GoalReachesDepth Int32, GoalReachesURL Int32, GoalReachesAny Int32, SocialSourceNetworkID UInt8, SocialSourcePage String, MobilePhoneModel String, ClientEventTime DateTime, RegionID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RemoteIP UInt32, RemoteIP6 FixedString(16), IPNetworkID UInt32, SilverlightVersion3 UInt32, CodeVersion UInt32, ResolutionWidth UInt16, ResolutionHeight UInt16, UserAgentMajor UInt16, UserAgentMinor UInt16, WindowClientWidth UInt16, WindowClientHeight UInt16, SilverlightVersion2 UInt8, SilverlightVersion4 UInt16, FlashVersion3 UInt16, FlashVersion4 UInt16, ClientTimeZone Int16, OS UInt8, UserAgent UInt8, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, NetMajor UInt8, NetMinor UInt8, MobilePhone UInt8, SilverlightVersion1 UInt8, Age UInt8, Sex UInt8, Income UInt8, JavaEnable UInt8, CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, BrowserLanguage UInt16, BrowserCountry UInt16, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), Params Array(String), Goals Nested(ID UInt32, Serial UInt32, EventTime DateTime, Price Int64, OrderID String, CurrencyID UInt32), WatchIDs Array(UInt64), ParamSumPrice Int64, ParamCurrency FixedString(3), ParamCurrencyID UInt16, ClickLogID UInt64, ClickEventID Int32, ClickGoodEvent Int32, ClickEventTime DateTime, ClickPriorityID Int32, ClickPhraseID Int32, ClickPageID Int32, ClickPlaceID Int32, ClickTypeID Int32, ClickResourceID Int32, ClickCost UInt32, ClickClientIP UInt32, ClickDomainID UInt32, ClickURL String, ClickAttempt UInt8, ClickOrderID UInt32, ClickBannerID UInt32, ClickMarketCategoryID UInt32, ClickMarketPP UInt32, ClickMarketCategoryName String, ClickMarketPPName String, ClickAWAPSCampaignName String, ClickPageName String, ClickTargetType UInt16, ClickTargetPhraseID UInt64, ClickContextType UInt8, ClickSelectType Int8, ClickOptions String, ClickGroupBannerID Int32, OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, FirstVisit DateTime, PredLastVisit Date, LastVisit Date, TotalVisits UInt32, TraficSource Nested(ID Int8, SearchEngineID UInt16, AdvEngineID UInt8, PlaceID UInt16, SocialSourceNetworkID UInt8, Domain String, SearchPhrase String, SocialSourcePage String), Attendance FixedString(16), CLID UInt32, YCLID UInt64, NormalizedRefererHash UInt64, SearchPhraseHash UInt64, RefererDomainHash UInt64, NormalizedStartURLHash UInt64, StartURLDomainHash UInt64, NormalizedEndURLHash UInt64, TopLevelDomain UInt64, URLScheme UInt64, OpenstatServiceNameHash UInt64, OpenstatCampaignIDHash UInt64, OpenstatAdIDHash UInt64, OpenstatSourceIDHash UInt64, UTMSourceHash UInt64, UTMMediumHash UInt64, UTMCampaignHash UInt64, UTMContentHash UInt64, UTMTermHash UInt64, FromHash UInt64, WebVisorEnabled UInt8, WebVisorActivity UInt32, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), Market Nested(Type UInt8, GoalID UInt32, OrderID String, OrderPrice Int64, PP UInt32, DirectPlaceID UInt32, DirectOrderID UInt32, DirectBannerID UInt32, GoodID String, GoodName String, GoodQuantity Int32, GoodPrice Int64), IslandID FixedString(16)) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)"
|
||||
# import data
|
||||
cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000
|
||||
# optionally you can optimize table
|
||||
clickhouse-client --query "OPTIMIZE TABLE datasets.visits_v1 FINAL"
|
||||
clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1"
|
||||
$ curl https://clickhouse-datasets.s3.yandex.net/visits/tsv/visits_v1.tsv.xz | unxz --threads=`nproc` > visits_v1.tsv
|
||||
$ # now create table
|
||||
$ clickhouse-client --query "CREATE DATABASE IF NOT EXISTS datasets"
|
||||
$ clickhouse-client --query "CREATE TABLE datasets.visits_v1 ( CounterID UInt32, StartDate Date, Sign Int8, IsNew UInt8, VisitID UInt64, UserID UInt64, StartTime DateTime, Duration UInt32, UTCStartTime DateTime, PageViews Int32, Hits Int32, IsBounce UInt8, Referer String, StartURL String, RefererDomain String, StartURLDomain String, EndURL String, LinkURL String, IsDownload UInt8, TraficSourceID Int8, SearchEngineID UInt16, SearchPhrase String, AdvEngineID UInt8, PlaceID Int32, RefererCategories Array(UInt16), URLCategories Array(UInt16), URLRegions Array(UInt32), RefererRegions Array(UInt32), IsYandex UInt8, GoalReachesDepth Int32, GoalReachesURL Int32, GoalReachesAny Int32, SocialSourceNetworkID UInt8, SocialSourcePage String, MobilePhoneModel String, ClientEventTime DateTime, RegionID UInt32, ClientIP UInt32, ClientIP6 FixedString(16), RemoteIP UInt32, RemoteIP6 FixedString(16), IPNetworkID UInt32, SilverlightVersion3 UInt32, CodeVersion UInt32, ResolutionWidth UInt16, ResolutionHeight UInt16, UserAgentMajor UInt16, UserAgentMinor UInt16, WindowClientWidth UInt16, WindowClientHeight UInt16, SilverlightVersion2 UInt8, SilverlightVersion4 UInt16, FlashVersion3 UInt16, FlashVersion4 UInt16, ClientTimeZone Int16, OS UInt8, UserAgent UInt8, ResolutionDepth UInt8, FlashMajor UInt8, FlashMinor UInt8, NetMajor UInt8, NetMinor UInt8, MobilePhone UInt8, SilverlightVersion1 UInt8, Age UInt8, Sex UInt8, Income UInt8, JavaEnable UInt8, CookieEnable UInt8, JavascriptEnable UInt8, IsMobile UInt8, BrowserLanguage UInt16, BrowserCountry UInt16, Interests UInt16, Robotness UInt8, GeneralInterests Array(UInt16), Params Array(String), Goals Nested(ID UInt32, Serial UInt32, EventTime DateTime, Price Int64, OrderID String, CurrencyID UInt32), WatchIDs Array(UInt64), ParamSumPrice Int64, ParamCurrency FixedString(3), ParamCurrencyID UInt16, ClickLogID UInt64, ClickEventID Int32, ClickGoodEvent Int32, ClickEventTime DateTime, ClickPriorityID Int32, ClickPhraseID Int32, ClickPageID Int32, ClickPlaceID Int32, ClickTypeID Int32, ClickResourceID Int32, ClickCost UInt32, ClickClientIP UInt32, ClickDomainID UInt32, ClickURL String, ClickAttempt UInt8, ClickOrderID UInt32, ClickBannerID UInt32, ClickMarketCategoryID UInt32, ClickMarketPP UInt32, ClickMarketCategoryName String, ClickMarketPPName String, ClickAWAPSCampaignName String, ClickPageName String, ClickTargetType UInt16, ClickTargetPhraseID UInt64, ClickContextType UInt8, ClickSelectType Int8, ClickOptions String, ClickGroupBannerID Int32, OpenstatServiceName String, OpenstatCampaignID String, OpenstatAdID String, OpenstatSourceID String, UTMSource String, UTMMedium String, UTMCampaign String, UTMContent String, UTMTerm String, FromTag String, HasGCLID UInt8, FirstVisit DateTime, PredLastVisit Date, LastVisit Date, TotalVisits UInt32, TraficSource Nested(ID Int8, SearchEngineID UInt16, AdvEngineID UInt8, PlaceID UInt16, SocialSourceNetworkID UInt8, Domain String, SearchPhrase String, SocialSourcePage String), Attendance FixedString(16), CLID UInt32, YCLID UInt64, NormalizedRefererHash UInt64, SearchPhraseHash UInt64, RefererDomainHash UInt64, NormalizedStartURLHash UInt64, StartURLDomainHash UInt64, NormalizedEndURLHash UInt64, TopLevelDomain UInt64, URLScheme UInt64, OpenstatServiceNameHash UInt64, OpenstatCampaignIDHash UInt64, OpenstatAdIDHash UInt64, OpenstatSourceIDHash UInt64, UTMSourceHash UInt64, UTMMediumHash UInt64, UTMCampaignHash UInt64, UTMContentHash UInt64, UTMTermHash UInt64, FromHash UInt64, WebVisorEnabled UInt8, WebVisorActivity UInt32, ParsedParams Nested(Key1 String, Key2 String, Key3 String, Key4 String, Key5 String, ValueDouble Float64), Market Nested(Type UInt8, GoalID UInt32, OrderID String, OrderPrice Int64, PP UInt32, DirectPlaceID UInt32, DirectOrderID UInt32, DirectBannerID UInt32, GoodID String, GoodName String, GoodQuantity Int32, GoodPrice Int64), IslandID FixedString(16)) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)"
|
||||
$ # import data
|
||||
$ cat visits_v1.tsv | clickhouse-client --query "INSERT INTO datasets.visits_v1 FORMAT TSV" --max_insert_block_size=100000
|
||||
$ # optionally you can optimize table
|
||||
$ clickhouse-client --query "OPTIMIZE TABLE datasets.visits_v1 FINAL"
|
||||
$ clickhouse-client --query "SELECT COUNT(*) FROM datasets.visits_v1"
|
||||
```
|
||||
|
||||
## Queries
|
||||
|
File diff suppressed because one or more lines are too long
@ -141,17 +141,17 @@ CREATE TABLE `ontime` (
|
||||
Loading data:
|
||||
|
||||
```bash
|
||||
for i in *.zip; do echo $i; unzip -cq $i '*.csv' | sed 's/\.00//g' | clickhouse-client --host=example-perftest01j --query="INSERT INTO ontime FORMAT CSVWithNames"; done
|
||||
$ for i in *.zip; do echo $i; unzip -cq $i '*.csv' | sed 's/\.00//g' | clickhouse-client --host=example-perftest01j --query="INSERT INTO ontime FORMAT CSVWithNames"; done
|
||||
```
|
||||
|
||||
## Dowload of Prepared Partitions
|
||||
## Download of Prepared Partitions
|
||||
|
||||
```bash
|
||||
curl -O https://clickhouse-datasets.s3.yandex.net/ontime/partitions/ontime.tar
|
||||
tar xvf ontime.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
# check permissions of unpacked data, fix if required
|
||||
sudo service clickhouse-server restart
|
||||
clickhouse-client --query "select count(*) from datasets.ontime"
|
||||
$ curl -O https://clickhouse-datasets.s3.yandex.net/ontime/partitions/ontime.tar
|
||||
$ tar xvf ontime.tar -C /var/lib/clickhouse # path to ClickHouse data directory
|
||||
$ # check permissions of unpacked data, fix if required
|
||||
$ sudo service clickhouse-server restart
|
||||
$ clickhouse-client --query "select count(*) from datasets.ontime"
|
||||
```
|
||||
|
||||
!!!info
|
||||
|
@ -2,25 +2,25 @@
|
||||
|
||||
Compiling dbgen:
|
||||
|
||||
```
|
||||
git clone git@github.com:vadimtk/ssb-dbgen.git
|
||||
cd ssb-dbgen
|
||||
make
|
||||
```bash
|
||||
$ git clone git@github.com:vadimtk/ssb-dbgen.git
|
||||
$ cd ssb-dbgen
|
||||
$ make
|
||||
```
|
||||
|
||||
Generating data:
|
||||
|
||||
```
|
||||
./dbgen -s 1000 -T c
|
||||
./dbgen -s 1000 -T l
|
||||
./dbgen -s 1000 -T p
|
||||
./dbgen -s 1000 -T s
|
||||
./dbgen -s 1000 -T d
|
||||
```bash
|
||||
$ ./dbgen -s 1000 -T c
|
||||
$ ./dbgen -s 1000 -T l
|
||||
$ ./dbgen -s 1000 -T p
|
||||
$ ./dbgen -s 1000 -T s
|
||||
$ ./dbgen -s 1000 -T d
|
||||
```
|
||||
|
||||
Creating tables in ClickHouse:
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE customer
|
||||
(
|
||||
C_CUSTKEY UInt32,
|
||||
@ -85,16 +85,16 @@ ENGINE = MergeTree ORDER BY S_SUPPKEY;
|
||||
|
||||
Inserting data:
|
||||
|
||||
```
|
||||
clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl
|
||||
clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl
|
||||
clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl
|
||||
clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl
|
||||
```bash
|
||||
$ clickhouse-client --query "INSERT INTO customer FORMAT CSV" < customer.tbl
|
||||
$ clickhouse-client --query "INSERT INTO part FORMAT CSV" < part.tbl
|
||||
$ clickhouse-client --query "INSERT INTO supplier FORMAT CSV" < supplier.tbl
|
||||
$ clickhouse-client --query "INSERT INTO lineorder FORMAT CSV" < lineorder.tbl
|
||||
```
|
||||
|
||||
Converting "star schema" to denormalized "flat schema":
|
||||
|
||||
```
|
||||
```sql
|
||||
SET max_memory_usage = 20000000000, allow_experimental_multiple_joins_emulation = 1;
|
||||
|
||||
CREATE TABLE lineorder_flat
|
||||
@ -112,44 +112,56 @@ ALTER TABLE lineorder_flat DROP COLUMN C_CUSTKEY, DROP COLUMN S_SUPPKEY, DROP CO
|
||||
|
||||
Running the queries:
|
||||
|
||||
```
|
||||
Q1.1
|
||||
```sql
|
||||
SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYear(LO_ORDERDATE) = 1993 AND LO_DISCOUNT BETWEEN 1 AND 3 AND LO_QUANTITY < 25;
|
||||
|
||||
```
|
||||
Q1.2
|
||||
```sql
|
||||
SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toYYYYMM(LO_ORDERDATE) = 199401 AND LO_DISCOUNT BETWEEN 4 AND 6 AND LO_QUANTITY BETWEEN 26 AND 35;
|
||||
|
||||
```
|
||||
Q1.3
|
||||
```sql
|
||||
SELECT sum(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE toISOWeek(LO_ORDERDATE) = 6 AND toYear(LO_ORDERDATE) = 1994 AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35;
|
||||
|
||||
```
|
||||
Q2.1
|
||||
```sql
|
||||
SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
|
||||
|
||||
```
|
||||
Q2.2
|
||||
```sql
|
||||
SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND BETWEEN 'MFGR#2221' AND 'MFGR#2228' AND S_REGION = 'ASIA' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
|
||||
|
||||
```
|
||||
Q2.3
|
||||
```sql
|
||||
SELECT sum(LO_REVENUE), toYear(LO_ORDERDATE) AS year, P_BRAND FROM lineorder_flat WHERE P_BRAND = 'MFGR#2239' AND S_REGION = 'EUROPE' GROUP BY year, P_BRAND ORDER BY year, P_BRAND;
|
||||
|
||||
```
|
||||
Q3.1
|
||||
```sql
|
||||
SELECT C_NATION, S_NATION, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND year >= 1992 AND year <= 1997 GROUP BY C_NATION, S_NATION, year ORDER BY year asc, revenue desc;
|
||||
|
||||
```
|
||||
Q3.2
|
||||
```sql
|
||||
SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
|
||||
|
||||
```
|
||||
Q3.3
|
||||
```sql
|
||||
SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND year >= 1992 AND year <= 1997 GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
|
||||
|
||||
```
|
||||
Q3.4
|
||||
```sql
|
||||
SELECT C_CITY, S_CITY, toYear(LO_ORDERDATE) AS year, sum(LO_REVENUE) AS revenue FROM lineorder_flat WHERE (C_CITY = 'UNITED KI1' OR C_CITY = 'UNITED KI5') AND (S_CITY = 'UNITED KI1' OR S_CITY = 'UNITED KI5') AND toYYYYMM(LO_ORDERDATE) = '199712' GROUP BY C_CITY, S_CITY, year ORDER BY year asc, revenue desc;
|
||||
|
||||
```
|
||||
Q4.1
|
||||
```sql
|
||||
SELECT toYear(LO_ORDERDATE) AS year, C_NATION, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, C_NATION ORDER BY year, C_NATION;
|
||||
|
||||
```
|
||||
Q4.2
|
||||
```sql
|
||||
SELECT toYear(LO_ORDERDATE) AS year, S_NATION, P_CATEGORY, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE C_REGION = 'AMERICA' AND S_REGION = 'AMERICA' AND (year = 1997 OR year = 1998) AND (P_MFGR = 'MFGR#1' OR P_MFGR = 'MFGR#2') GROUP BY year, S_NATION, P_CATEGORY ORDER BY year, S_NATION, P_CATEGORY;
|
||||
|
||||
```
|
||||
Q4.3
|
||||
```sql
|
||||
SELECT toYear(LO_ORDERDATE) AS year, S_CITY, P_BRAND, sum(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE S_NATION = 'UNITED STATES' AND (year = 1997 OR year = 1998) AND P_CATEGORY = 'MFGR#14' GROUP BY year, S_CITY, P_BRAND ORDER BY year, S_CITY, P_BRAND;
|
||||
```
|
||||
|
||||
|
@ -20,9 +20,9 @@ CREATE TABLE wikistat
|
||||
Loading data:
|
||||
|
||||
```bash
|
||||
for i in {2007..2016}; do for j in {01..12}; do echo $i-$j >&2; curl -sSL "http://dumps.wikimedia.org/other/pagecounts-raw/$i/$i-$j/" | grep -oE 'pagecounts-[0-9]+-[0-9]+\.gz'; done; done | sort | uniq | tee links.txt
|
||||
cat links.txt | while read link; do wget http://dumps.wikimedia.org/other/pagecounts-raw/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1/')/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1-\2/')/$link; done
|
||||
ls -1 /opt/wikistat/ | grep gz | while read i; do echo $i; gzip -cd /opt/wikistat/$i | ./wikistat-loader --time="$(echo -n $i | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})([0-9]{2})-([0-9]{2})([0-9]{2})([0-9]{2})\.gz/\1-\2-\3 \4-00-00/')" | clickhouse-client --query="INSERT INTO wikistat FORMAT TabSeparated"; done
|
||||
$ for i in {2007..2016}; do for j in {01..12}; do echo $i-$j >&2; curl -sSL "http://dumps.wikimedia.org/other/pagecounts-raw/$i/$i-$j/" | grep -oE 'pagecounts-[0-9]+-[0-9]+\.gz'; done; done | sort | uniq | tee links.txt
|
||||
$ cat links.txt | while read link; do wget http://dumps.wikimedia.org/other/pagecounts-raw/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1/')/$(echo $link | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})[0-9]{2}-[0-9]+\.gz/\1-\2/')/$link; done
|
||||
$ ls -1 /opt/wikistat/ | grep gz | while read i; do echo $i; gzip -cd /opt/wikistat/$i | ./wikistat-loader --time="$(echo -n $i | sed -r 's/pagecounts-([0-9]{4})([0-9]{2})([0-9]{2})-([0-9]{2})([0-9]{2})([0-9]{2})\.gz/\1-\2-\3 \4-00-00/')" | clickhouse-client --query="INSERT INTO wikistat FORMAT TabSeparated"; done
|
||||
```
|
||||
|
||||
|
||||
|
@ -18,8 +18,8 @@ Yandex ClickHouse team recommends using official pre-compiled `deb` packages for
|
||||
|
||||
To install official packages add the Yandex repository in `/etc/apt/sources.list` or in a separate `/etc/apt/sources.list.d/clickhouse.list` file:
|
||||
|
||||
```
|
||||
deb http://repo.yandex.ru/clickhouse/deb/stable/ main/
|
||||
```bash
|
||||
$ deb http://repo.yandex.ru/clickhouse/deb/stable/ main/
|
||||
```
|
||||
|
||||
If you want to use the most recent version, replace `stable` with `testing` (this is recommended for your testing environments).
|
||||
@ -27,10 +27,10 @@ If you want to use the most recent version, replace `stable` with `testing` (thi
|
||||
Then run these commands to actually install packages:
|
||||
|
||||
```bash
|
||||
sudo apt-get install dirmngr # optional
|
||||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 # optional
|
||||
sudo apt-get update
|
||||
sudo apt-get install clickhouse-client clickhouse-server
|
||||
$ sudo apt-get install dirmngr # optional
|
||||
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 # optional
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install clickhouse-client clickhouse-server
|
||||
```
|
||||
|
||||
You can also download and install packages manually from here: <https://repo.yandex.ru/clickhouse/deb/stable/main/>.
|
||||
@ -42,9 +42,9 @@ Yandex ClickHouse team recommends using official pre-compiled `rpm` packages for
|
||||
First you need to add the official repository:
|
||||
|
||||
```bash
|
||||
sudo yum install yum-utils
|
||||
sudo rpm --import https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
|
||||
sudo yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
|
||||
$ sudo yum install yum-utils
|
||||
$ sudo rpm --import https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
|
||||
$ sudo yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64
|
||||
```
|
||||
|
||||
If you want to use the most recent version, replace `stable` with `testing` (this is recommended for your testing environments).
|
||||
@ -52,7 +52,7 @@ If you want to use the most recent version, replace `stable` with `testing` (thi
|
||||
Then run these commands to actually install packages:
|
||||
|
||||
```bash
|
||||
sudo yum install clickhouse-server clickhouse-client
|
||||
$ sudo yum install clickhouse-server clickhouse-client
|
||||
```
|
||||
|
||||
You can also download and install packages manually from here: <https://repo.yandex.ru/clickhouse/rpm/stable/x86_64>.
|
||||
@ -67,13 +67,13 @@ To manually compile ClickHouse, follow the instructions for [Linux](../developme
|
||||
|
||||
You can compile packages and install them or use programs without installing packages. Also by building manually you can disable SSE 4.2 requirement or build for AArch64 CPUs.
|
||||
|
||||
```
|
||||
```text
|
||||
Client: dbms/programs/clickhouse-client
|
||||
Server: dbms/programs/clickhouse-server
|
||||
```
|
||||
|
||||
You'll need to create a data and metadata folders and `chown` them for the desired user. Their paths can be changed in server config (src/dbms/programs/server/config.xml), by default they are:
|
||||
```
|
||||
```text
|
||||
/opt/clickhouse/data/default/
|
||||
/opt/clickhouse/metadata/default/
|
||||
```
|
||||
@ -129,18 +129,14 @@ $ ./clickhouse-client
|
||||
ClickHouse client version 0.0.18749.
|
||||
Connecting to localhost:9000.
|
||||
Connected to ClickHouse server version 0.0.18749.
|
||||
|
||||
:) SELECT 1
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT 1
|
||||
|
||||
```
|
||||
```text
|
||||
┌─1─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
|
||||
1 rows in set. Elapsed: 0.003 sec.
|
||||
|
||||
:)
|
||||
```
|
||||
|
||||
**Congratulations, the system works!**
|
||||
|
@ -78,22 +78,16 @@ See the difference?
|
||||
For example, the query "count the number of records for each advertising platform" requires reading one "advertising platform ID" column, which takes up 1 byte uncompressed. If most of the traffic was not from advertising platforms, you can expect at least 10-fold compression of this column. When using a quick compression algorithm, data decompression is possible at a speed of at least several gigabytes of uncompressed data per second. In other words, this query can be processed at a speed of approximately several billion rows per second on a single server. This speed is actually achieved in practice.
|
||||
|
||||
<details markdown="1"><summary>Example</summary>
|
||||
```
|
||||
```bash
|
||||
$ clickhouse-client
|
||||
ClickHouse client version 0.0.52053.
|
||||
Connecting to localhost:9000.
|
||||
Connected to ClickHouse server version 0.0.52053.
|
||||
|
||||
:) SELECT CounterID, count() FROM hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20
|
||||
|
||||
SELECT
|
||||
CounterID,
|
||||
count()
|
||||
FROM hits
|
||||
GROUP BY CounterID
|
||||
ORDER BY count() DESC
|
||||
LIMIT 20
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT CounterID, count() FROM hits GROUP BY CounterID ORDER BY count() DESC LIMIT 20
|
||||
```
|
||||
```text
|
||||
┌─CounterID─┬──count()─┐
|
||||
│ 114208 │ 56057344 │
|
||||
│ 115080 │ 51619590 │
|
||||
@ -116,10 +110,6 @@ LIMIT 20
|
||||
│ 115079 │ 8837972 │
|
||||
│ 337234 │ 8205961 │
|
||||
└───────────┴──────────┘
|
||||
|
||||
20 rows in set. Elapsed: 0.153 sec. Processed 1.00 billion rows, 4.00 GB (6.53 billion rows/s., 26.10 GB/s.)
|
||||
|
||||
:)
|
||||
```
|
||||
|
||||
</details>
|
||||
|
@ -22,14 +22,14 @@ Similar to the HTTP interface, when using the 'query' parameter and sending data
|
||||
Example of using the client to insert data:
|
||||
|
||||
```bash
|
||||
echo -ne "1, 'some text', '2016-08-14 00:00:00'\n2, 'some more text', '2016-08-14 00:00:01'" | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
$ echo -ne "1, 'some text', '2016-08-14 00:00:00'\n2, 'some more text', '2016-08-14 00:00:01'" | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
|
||||
cat <<_EOF | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
$ cat <<_EOF | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
3, 'some text', '2016-08-14 00:00:00'
|
||||
4, 'some more text', '2016-08-14 00:00:01'
|
||||
_EOF
|
||||
|
||||
cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
$ cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
|
||||
```
|
||||
|
||||
In batch mode, the default data format is TabSeparated. You can set the format in the FORMAT clause of the query.
|
||||
@ -70,14 +70,14 @@ The command-line client allows passing external data (external temporary tables)
|
||||
You can create a query with parameters and pass values to them from client application. This allows to avoid formatting query with specific dynamic values on client side. For example:
|
||||
|
||||
```bash
|
||||
clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}"
|
||||
$ clickhouse-client --param_parName="[1, 2]" -q "SELECT * FROM table WHERE a = {parName:Array(UInt16)}"
|
||||
```
|
||||
|
||||
#### Query Syntax {#cli-queries-with-parameters-syntax}
|
||||
|
||||
Format a query as usual, then place the values that you want to pass from the app parameters to the query in braces in the following format:
|
||||
|
||||
```
|
||||
```sql
|
||||
{<name>:<data type>}
|
||||
```
|
||||
|
||||
@ -87,7 +87,7 @@ Format a query as usual, then place the values that you want to pass from the ap
|
||||
#### Example
|
||||
|
||||
```bash
|
||||
clickhouse-client --param_tuple_in_tuple="(10, ('dt', 10))" -q "SELECT * FROM table WHERE val = {tuple_in_tuple:Tuple(UInt8, Tuple(String, UInt8))}"
|
||||
$ clickhouse-client --param_tuple_in_tuple="(10, ('dt', 10))" -q "SELECT * FROM table WHERE val = {tuple_in_tuple:Tuple(UInt8, Tuple(String, UInt8))}"
|
||||
```
|
||||
|
||||
## Configuring {#interfaces_cli_configuration}
|
||||
|
@ -51,7 +51,7 @@ The `TabSeparated` format supports outputting total values (when using WITH TOTA
|
||||
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated``
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
2014-03-17 1406958
|
||||
2014-03-18 1383658
|
||||
2014-03-19 1405797
|
||||
@ -83,7 +83,7 @@ As an exception, parsing dates with times is also supported in Unix timestamp fo
|
||||
|
||||
Strings are output with backslash-escaped special characters. The following escape sequences are used for output: `\b`, `\f`, `\r`, `\n`, `\t`, `\0`, `\'`, `\\`. Parsing also supports the sequences `\a`, `\v`, and `\xHH` (hex escape sequences) and any `\c` sequences, where `c` is any character (these sequences are converted to `c`). Thus, reading data supports formats where a line feed can be written as `\n` or `\`, or as a line feed. For example, the string `Hello world` with a line feed between the words instead of a space can be parsed in any of the following variations:
|
||||
|
||||
```
|
||||
```text
|
||||
Hello\nworld
|
||||
|
||||
Hello\
|
||||
@ -211,7 +211,7 @@ format_schema_rows_between_delimiter = '\n '
|
||||
```
|
||||
|
||||
`Insert` example:
|
||||
```
|
||||
```text
|
||||
Some header
|
||||
Page views: 5, User id: 4324182021466249494, Useless field: hello, Duration: 146, Sign: -1
|
||||
Page views: 6, User id: 4324182021466249494, Useless field: world, Duration: 185, Sign: 1
|
||||
@ -241,7 +241,7 @@ format_schema_rows_between_delimiter = ','
|
||||
|
||||
Similar to TabSeparated, but outputs a value in name=value format. Names are escaped the same way as in TabSeparated format, and the = symbol is also escaped.
|
||||
|
||||
```
|
||||
```text
|
||||
SearchPhrase= count()=8267016
|
||||
SearchPhrase=bathroom interior design count()=2166
|
||||
SearchPhrase=yandex count()=1655
|
||||
@ -260,7 +260,7 @@ SearchPhrase=baku count()=1000
|
||||
SELECT * FROM t_null FORMAT TSKV
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
x=1 y=\N
|
||||
```
|
||||
|
||||
@ -276,8 +276,8 @@ Comma Separated Values format ([RFC](https://tools.ietf.org/html/rfc4180)).
|
||||
|
||||
When formatting, rows are enclosed in double quotes. A double quote inside a string is output as two double quotes in a row. There are no other rules for escaping characters. Date and date-time are enclosed in double quotes. Numbers are output without quotes. Values are separated by a delimiter character, which is `,` by default. The delimiter character is defined in the setting [format_csv_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter). Rows are separated using the Unix line feed (LF). Arrays are serialized in CSV as follows: first the array is serialized to a string as in TabSeparated format, and then the resulting string is output to CSV in double quotes. Tuples in CSV format are serialized as separate columns (that is, their nesting in the tuple is lost).
|
||||
|
||||
```
|
||||
clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv
|
||||
```bash
|
||||
$ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv
|
||||
```
|
||||
|
||||
*By default, the delimiter is `,`. See the [format_csv_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter) setting for more information.
|
||||
@ -445,7 +445,7 @@ When inserting the data, you should provide a separate JSON object for each row.
|
||||
|
||||
### Inserting Data
|
||||
|
||||
```
|
||||
```sql
|
||||
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
|
||||
```
|
||||
|
||||
@ -464,7 +464,7 @@ If `DEFAULT expr` is specified, ClickHouse uses different substitution rules dep
|
||||
|
||||
Consider the following table:
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE IF NOT EXISTS example_table
|
||||
(
|
||||
x UInt32,
|
||||
@ -482,7 +482,7 @@ CREATE TABLE IF NOT EXISTS example_table
|
||||
|
||||
Consider the `UserActivity` table as an example:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
@ -491,7 +491,7 @@ Consider the `UserActivity` table as an example:
|
||||
|
||||
The query `SELECT * FROM UserActivity FORMAT JSONEachRow` returns:
|
||||
|
||||
```
|
||||
```text
|
||||
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
|
||||
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
|
||||
```
|
||||
@ -580,7 +580,7 @@ Example (shown for the [PrettyCompact](#prettycompact) format):
|
||||
SELECT * FROM t_null
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
└───┴──────┘
|
||||
@ -592,7 +592,7 @@ Rows are not escaped in Pretty* formats. Example is shown for the [PrettyCompact
|
||||
SELECT 'String with \'quotes\' and \t character' AS Escaping_test
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─Escaping_test────────────────────────┐
|
||||
│ String with 'quotes' and character │
|
||||
└──────────────────────────────────────┘
|
||||
@ -607,7 +607,7 @@ The Pretty format supports outputting total values (when using WITH TOTALS) and
|
||||
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──EventDate─┬───────c─┐
|
||||
│ 2014-03-17 │ 1406958 │
|
||||
│ 2014-03-18 │ 1383658 │
|
||||
@ -646,7 +646,7 @@ Differs from Pretty in that ANSI-escape sequences aren't used. This is necessary
|
||||
Example:
|
||||
|
||||
```bash
|
||||
watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'"
|
||||
$ watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'"
|
||||
```
|
||||
|
||||
You can use the HTTP interface for displaying in the browser.
|
||||
@ -706,7 +706,7 @@ Example:
|
||||
SELECT * FROM t_null FORMAT Vertical
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
Row 1:
|
||||
──────
|
||||
x: 1
|
||||
@ -718,7 +718,7 @@ Rows are not escaped in Vertical format:
|
||||
SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT Vertical
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
Row 1:
|
||||
──────
|
||||
test: string with 'quotes' and with some special
|
||||
@ -807,12 +807,12 @@ Cap'n Proto is a binary message format similar to Protocol Buffers and Thrift, b
|
||||
Cap'n Proto messages are strictly typed and not self-describing, meaning they need an external schema description. The schema is applied on the fly and cached for each query.
|
||||
|
||||
```bash
|
||||
cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits FORMAT CapnProto SETTINGS format_schema='schema:Message'"
|
||||
$ cat capnproto_messages.bin | clickhouse-client --query "INSERT INTO test.hits FORMAT CapnProto SETTINGS format_schema='schema:Message'"
|
||||
```
|
||||
|
||||
Where `schema.capnp` looks like this:
|
||||
|
||||
```
|
||||
```capnp
|
||||
struct Message {
|
||||
SearchPhrase @0 :Text;
|
||||
c @1 :Uint64;
|
||||
@ -842,7 +842,7 @@ cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table FO
|
||||
|
||||
where the file `schemafile.proto` looks like this:
|
||||
|
||||
```
|
||||
```capnp
|
||||
syntax = "proto3";
|
||||
|
||||
message MessageType {
|
||||
@ -859,7 +859,7 @@ If types of a column and a field of Protocol Buffers' message are different the
|
||||
|
||||
Nested messages are supported. For example, for the field `z` in the following message type
|
||||
|
||||
```
|
||||
```capnp
|
||||
message MessageType {
|
||||
message XType {
|
||||
message YType {
|
||||
@ -876,7 +876,7 @@ Nested messages are suitable to input or output a [nested data structures](../da
|
||||
|
||||
Default values defined in a protobuf schema like this
|
||||
|
||||
```
|
||||
```capnp
|
||||
syntax = "proto2";
|
||||
|
||||
message MessageType {
|
||||
|
@ -75,31 +75,31 @@ The POST method of transmitting data is necessary for INSERT queries. In this ca
|
||||
Examples: Creating a table:
|
||||
|
||||
```bash
|
||||
echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @-
|
||||
$ echo 'CREATE TABLE t (a UInt8) ENGINE = Memory' | curl 'http://localhost:8123/' --data-binary @-
|
||||
```
|
||||
|
||||
Using the familiar INSERT query for data insertion:
|
||||
|
||||
```bash
|
||||
echo 'INSERT INTO t VALUES (1),(2),(3)' | curl 'http://localhost:8123/' --data-binary @-
|
||||
$ echo 'INSERT INTO t VALUES (1),(2),(3)' | curl 'http://localhost:8123/' --data-binary @-
|
||||
```
|
||||
|
||||
Data can be sent separately from the query:
|
||||
|
||||
```bash
|
||||
echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @-
|
||||
$ echo '(4),(5),(6)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20VALUES' --data-binary @-
|
||||
```
|
||||
|
||||
You can specify any data format. The 'Values' format is the same as what is used when writing INSERT INTO t VALUES:
|
||||
|
||||
```bash
|
||||
echo '(7),(8),(9)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20Values' --data-binary @-
|
||||
$ echo '(7),(8),(9)' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20Values' --data-binary @-
|
||||
```
|
||||
|
||||
To insert data from a tab-separated dump, specify the corresponding format:
|
||||
|
||||
```bash
|
||||
echo -ne '10\n11\n12\n' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20TabSeparated' --data-binary @-
|
||||
$ echo -ne '10\n11\n12\n' | curl 'http://localhost:8123/?query=INSERT%20INTO%20t%20FORMAT%20TabSeparated' --data-binary @-
|
||||
```
|
||||
|
||||
Reading the table contents. Data is output in random order due to parallel query processing:
|
||||
@ -123,7 +123,7 @@ $ curl 'http://localhost:8123/?query=SELECT%20a%20FROM%20t'
|
||||
Deleting the table.
|
||||
|
||||
```bash
|
||||
echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @-
|
||||
$ echo 'DROP TABLE t' | curl 'http://localhost:8123/' --data-binary @-
|
||||
```
|
||||
|
||||
For successful requests that don't return a data table, an empty response body is returned.
|
||||
@ -141,10 +141,10 @@ Examples of sending data with compression:
|
||||
|
||||
```bash
|
||||
#Sending data to the server:
|
||||
curl -vsS "http://localhost:8123/?enable_http_compression=1" -d 'SELECT number FROM system.numbers LIMIT 10' -H 'Accept-Encoding: gzip'
|
||||
$ curl -vsS "http://localhost:8123/?enable_http_compression=1" -d 'SELECT number FROM system.numbers LIMIT 10' -H 'Accept-Encoding: gzip'
|
||||
|
||||
#Sending data to the client:
|
||||
echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/'
|
||||
$ echo "SELECT 1" | gzip -c | curl -sS --data-binary @- -H 'Content-Encoding: gzip' 'http://localhost:8123/'
|
||||
```
|
||||
|
||||
!!! note "Note"
|
||||
@ -173,13 +173,13 @@ The username and password can be indicated in one of two ways:
|
||||
1. Using HTTP Basic Authentication. Example:
|
||||
|
||||
```bash
|
||||
echo 'SELECT 1' | curl 'http://user:password@localhost:8123/' -d @-
|
||||
$ echo 'SELECT 1' | curl 'http://user:password@localhost:8123/' -d @-
|
||||
```
|
||||
|
||||
2. In the 'user' and 'password' URL parameters. Example:
|
||||
|
||||
```bash
|
||||
echo 'SELECT 1' | curl 'http://localhost:8123/?user=user&password=password' -d @-
|
||||
$ echo 'SELECT 1' | curl 'http://localhost:8123/?user=user&password=password' -d @-
|
||||
```
|
||||
|
||||
If the user name is not specified, the `default` name is used. If the password is not specified, the empty password is used.
|
||||
@ -207,7 +207,7 @@ Similarly, you can use ClickHouse sessions in the HTTP protocol. To do this, you
|
||||
|
||||
You can receive information about the progress of a query in `X-ClickHouse-Progress` response headers. To do this, enable [send_progress_in_http_headers](../operations/settings/settings.md#settings-send_progress_in_http_headers). Example of the header sequence:
|
||||
|
||||
```
|
||||
```text
|
||||
X-ClickHouse-Progress: {"read_rows":"2752512","read_bytes":"240570816","total_rows_to_read":"8880128"}
|
||||
X-ClickHouse-Progress: {"read_rows":"5439488","read_bytes":"482285394","total_rows_to_read":"8880128"}
|
||||
X-ClickHouse-Progress: {"read_rows":"8783786","read_bytes":"819092887","total_rows_to_read":"8880128"}
|
||||
@ -239,7 +239,7 @@ To ensure that the entire response is buffered, set `wait_end_of_query=1`. In th
|
||||
Example:
|
||||
|
||||
```bash
|
||||
curl -sS 'http://localhost:8123/?max_result_bytes=4000000&buffer_size=3000000&wait_end_of_query=1' -d 'SELECT toUInt8(number) FROM system.numbers LIMIT 9000000 FORMAT RowBinary'
|
||||
$ curl -sS 'http://localhost:8123/?max_result_bytes=4000000&buffer_size=3000000&wait_end_of_query=1' -d 'SELECT toUInt8(number) FROM system.numbers LIMIT 9000000 FORMAT RowBinary'
|
||||
```
|
||||
|
||||
Use buffering to avoid situations where a query processing error occurred after the response code and HTTP headers were sent to the client. In this situation, an error message is written at the end of the response body, and on the client side, the error can only be detected at the parsing stage.
|
||||
@ -251,7 +251,7 @@ You can create a query with parameters and pass values for them from the corresp
|
||||
### Example
|
||||
|
||||
```bash
|
||||
curl -sS "<address>?param_id=2¶m_phrase=test" -d "SELECT * FROM table WHERE int_column = {id:UInt8} and string_column = {phrase:String}"
|
||||
$ curl -sS "<address>?param_id=2¶m_phrase=test" -d "SELECT * FROM table WHERE int_column = {id:UInt8} and string_column = {phrase:String}"
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/interfaces/http_interface/) <!--hide-->
|
||||
|
@ -20,8 +20,10 @@ Substitutions can also be performed from ZooKeeper. To do this, specify the attr
|
||||
The `config.xml` file can specify a separate config with user settings, profiles, and quotas. The relative path to this config is set in the 'users_config' element. By default, it is `users.xml`. If `users_config` is omitted, the user settings, profiles, and quotas are specified directly in `config.xml`.
|
||||
|
||||
In addition, `users_config` may have overrides in files from the `users_config.d` directory (for example, `users.d`) and substitutions. For example, you can have separate config file for each user like this:
|
||||
``` xml
|
||||
```bash
|
||||
$ cat /etc/clickhouse-server/users.d/alice.xml
|
||||
```
|
||||
```xml
|
||||
<yandex>
|
||||
<users>
|
||||
<alice>
|
||||
|
@ -3,7 +3,7 @@
|
||||
The constraints on settings can be defined in the `users` section of the `user.xml` configuration file and prohibit users from changing some of the settings with the `SET` query.
|
||||
The constraints are defined as following:
|
||||
|
||||
```
|
||||
```xml
|
||||
<profiles>
|
||||
<user_name>
|
||||
<constraints>
|
||||
@ -30,7 +30,7 @@ There are supported three types of constraints: `min`, `max`, `readonly`. The `m
|
||||
|
||||
**Example:** Let `users.xml` includes lines:
|
||||
|
||||
```
|
||||
```xml
|
||||
<profiles>
|
||||
<default>
|
||||
<max_memory_usage>10000000000</max_memory_usage>
|
||||
@ -51,13 +51,13 @@ There are supported three types of constraints: `min`, `max`, `readonly`. The `m
|
||||
|
||||
The following queries all throw exceptions:
|
||||
|
||||
```
|
||||
```sql
|
||||
SET max_memory_usage=20000000001;
|
||||
SET max_memory_usage=4999999999;
|
||||
SET force_index_by_date=1;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be greater than 20000000000.
|
||||
Code: 452, e.displayText() = DB::Exception: Setting max_memory_usage should not be less than 5000000000.
|
||||
Code: 452, e.displayText() = DB::Exception: Setting force_index_by_date should not be changed.
|
||||
|
@ -179,7 +179,8 @@ Insert the [DateTime](../../data_types/datetime.md) type value with the differen
|
||||
```sql
|
||||
SET input_format_values_interpret_expressions = 0;
|
||||
INSERT INTO datetime_t VALUES (now())
|
||||
|
||||
```
|
||||
```text
|
||||
Exception on client:
|
||||
Code: 27. DB::Exception: Cannot parse input: expected ) before: now()): (at row 1)
|
||||
```
|
||||
@ -187,7 +188,8 @@ Code: 27. DB::Exception: Cannot parse input: expected ) before: now()): (at row
|
||||
```sql
|
||||
SET input_format_values_interpret_expressions = 1;
|
||||
INSERT INTO datetime_t VALUES (now())
|
||||
|
||||
```
|
||||
```text
|
||||
Ok.
|
||||
```
|
||||
|
||||
@ -196,7 +198,8 @@ The last query is equivalent to the following:
|
||||
```sql
|
||||
SET input_format_values_interpret_expressions = 0;
|
||||
INSERT INTO datetime_t SELECT now()
|
||||
|
||||
```
|
||||
```text
|
||||
Ok.
|
||||
```
|
||||
|
||||
@ -599,7 +602,7 @@ ClickHouse supports the following algorithms of choosing replicas:
|
||||
|
||||
### Random (by default) {#load_balancing-random}
|
||||
|
||||
```
|
||||
```sql
|
||||
load_balancing = random
|
||||
```
|
||||
|
||||
@ -608,7 +611,7 @@ Disadvantages: Server proximity is not accounted for; if the replicas have diffe
|
||||
|
||||
### Nearest Hostname {#load_balancing-nearest_hostname}
|
||||
|
||||
```
|
||||
```sql
|
||||
load_balancing = nearest_hostname
|
||||
```
|
||||
|
||||
@ -622,7 +625,7 @@ We can also assume that when sending a query to the same server, in the absence
|
||||
|
||||
### In Order {#load_balancing-in_order}
|
||||
|
||||
```
|
||||
```sql
|
||||
load_balancing = in_order
|
||||
```
|
||||
|
||||
@ -632,7 +635,7 @@ This method is appropriate when you know exactly which replica is preferable.
|
||||
|
||||
### First or Random {#load_balancing-first_or_random}
|
||||
|
||||
```
|
||||
```sql
|
||||
load_balancing = first_or_random
|
||||
```
|
||||
|
||||
|
@ -4,7 +4,7 @@ The `users` section of the `user.xml` configuration file contains user settings.
|
||||
|
||||
Structure of the `users` section:
|
||||
|
||||
```
|
||||
```xml
|
||||
<users>
|
||||
<!-- If user name was not specified, 'default' user is used. -->
|
||||
<user_name>
|
||||
@ -80,7 +80,7 @@ All results of DNS requests are cached until the server restarts.
|
||||
|
||||
To open access for user from any network, specify:
|
||||
|
||||
```
|
||||
```xml
|
||||
<ip>::/0</ip>
|
||||
```
|
||||
|
||||
@ -90,7 +90,7 @@ To open access for user from any network, specify:
|
||||
|
||||
To open access only from localhost, specify:
|
||||
|
||||
```
|
||||
```xml
|
||||
<ip>::1</ip>
|
||||
<ip>127.0.0.1</ip>
|
||||
```
|
||||
@ -114,7 +114,7 @@ In this section, you can you can limit rows that are returned by ClickHouse for
|
||||
|
||||
The following configuration forces that user `user1` can only see the rows of `table1` as the result of `SELECT` queries, where the value of the `id` field is 1000.
|
||||
|
||||
```
|
||||
```xml
|
||||
<user1>
|
||||
<databases>
|
||||
<database_name>
|
||||
|
@ -494,7 +494,7 @@ WHERE table = 'visits'
|
||||
FORMAT Vertical
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
Row 1:
|
||||
──────
|
||||
database: merge
|
||||
@ -520,7 +520,7 @@ active_replicas: 2
|
||||
|
||||
Columns:
|
||||
|
||||
```
|
||||
```text
|
||||
database: Database name
|
||||
table: Table name
|
||||
engine: Table engine name
|
||||
@ -625,7 +625,7 @@ FROM system.settings
|
||||
WHERE changed
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name───────────────────┬─value───────┬─changed─┐
|
||||
│ max_threads │ 8 │ 1 │
|
||||
│ use_uncompressed_cache │ 0 │ 1 │
|
||||
@ -693,7 +693,7 @@ WHERE path = '/clickhouse/tables/01-08/visits/replicas'
|
||||
FORMAT Vertical
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
Row 1:
|
||||
──────
|
||||
name: example01-08-1.yandex.ru
|
||||
|
@ -65,7 +65,7 @@ Use the particular column `Sign`. If `Sign = 1` it means that the row is a state
|
||||
|
||||
For example, we want to calculate how much pages users checked at some site and how long they were there. At some moment of time we write the following row with the state of user activity:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┘
|
||||
@ -73,7 +73,7 @@ For example, we want to calculate how much pages users checked at some site and
|
||||
|
||||
At some moment later we register the change of user activity and write it with the following two rows.
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
@ -86,7 +86,7 @@ The second row contains the current state.
|
||||
|
||||
As we need only the last state of user activity, the rows
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │
|
||||
@ -131,7 +131,7 @@ If you need to extract data without aggregation (for example, to check whether r
|
||||
|
||||
Example data:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │
|
||||
@ -166,11 +166,11 @@ We use two `INSERT` queries to create two different data parts. If we insert the
|
||||
|
||||
Getting the data:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM UAct
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
@ -195,7 +195,7 @@ FROM UAct
|
||||
GROUP BY UserID
|
||||
HAVING sum(Sign) > 0
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │
|
||||
└─────────────────────┴───────────┴──────────┘
|
||||
@ -206,7 +206,7 @@ If we do not need aggregation and want to force collapsing, we can use `FINAL` m
|
||||
```sql
|
||||
SELECT * FROM UAct FINAL
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┘
|
||||
@ -218,7 +218,7 @@ This way of selecting the data is very inefficient. Don't use it for big tables.
|
||||
|
||||
Example data:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │
|
||||
│ 4324182021466249494 │ -5 │ -146 │ -1 │
|
||||
@ -247,28 +247,38 @@ insert into UAct values(4324182021466249494, -5, -146, -1);
|
||||
insert into UAct values(4324182021466249494, 6, 185, 1);
|
||||
|
||||
select * from UAct final; // avoid using final in production (just for a test or small tables)
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT
|
||||
UserID,
|
||||
sum(PageViews) AS PageViews,
|
||||
sum(Duration) AS Duration
|
||||
FROM UAct
|
||||
GROUP BY UserID
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │
|
||||
└─────────────────────┴───────────┴──────────┘
|
||||
|
||||
```
|
||||
```sqk
|
||||
select count() FROM UAct
|
||||
```
|
||||
```text
|
||||
┌─count()─┐
|
||||
│ 3 │
|
||||
└─────────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
optimize table UAct final;
|
||||
|
||||
select * FROM UAct
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┘
|
||||
|
@ -44,7 +44,7 @@ FROM system.parts
|
||||
WHERE table = 'visits'
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─partition─┬─name───────────┬─active─┐
|
||||
│ 201901 │ 201901_1_3_1 │ 0 │
|
||||
│ 201901 │ 201901_1_9_2 │ 1 │
|
||||
@ -78,7 +78,7 @@ As you can see in the example, there are several separated parts of the same par
|
||||
OPTIMIZE TABLE visits PARTITION 201902;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─partition─┬─name───────────┬─active─┐
|
||||
│ 201901 │ 201901_1_3_1 │ 0 │
|
||||
│ 201901 │ 201901_1_9_2 │ 1 │
|
||||
@ -96,7 +96,7 @@ Inactive parts will be deleted approximately 10 minutes after merging.
|
||||
Another way to view a set of parts and partitions is to go into the directory of the table: `/var/lib/clickhouse/data/<database>/<table>/`. For example:
|
||||
|
||||
```bash
|
||||
dev:/var/lib/clickhouse/data/default/visits$ ls -l
|
||||
/var/lib/clickhouse/data/default/visits$ ls -l
|
||||
total 40
|
||||
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 1 16:48 201901_1_3_1
|
||||
drwxr-xr-x 2 clickhouse clickhouse 4096 Feb 5 16:17 201901_1_9_2
|
||||
|
@ -39,8 +39,6 @@ As an example, consider a dictionary of `products` with the following configurat
|
||||
Query the dictionary data:
|
||||
|
||||
```sql
|
||||
select name, type, key, attribute.names, attribute.types, bytes_allocated, element_count,source from system.dictionaries where name = 'products';
|
||||
|
||||
SELECT
|
||||
name,
|
||||
type,
|
||||
@ -54,7 +52,7 @@ FROM system.dictionaries
|
||||
WHERE name = 'products'
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─────┬─type─┬─key────┬─attribute.names─┬─attribute.types─┬─bytes_allocated─┬─element_count─┬─source──────────┐
|
||||
│ products │ Flat │ UInt64 │ ['title'] │ ['String'] │ 23065376 │ 175032 │ ODBC: .products │
|
||||
└──────────┴──────┴────────┴─────────────────┴─────────────────┴─────────────────┴───────────────┴─────────────────┘
|
||||
@ -66,7 +64,7 @@ This view isn't helpful when you need to get raw data, or when performing a `JOI
|
||||
|
||||
Syntax:
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE %table_name% (%fields%) engine = Dictionary(%dictionary_name%)`
|
||||
```
|
||||
|
||||
@ -74,37 +72,21 @@ Usage example:
|
||||
|
||||
```sql
|
||||
create table products (product_id UInt64, title String) Engine = Dictionary(products);
|
||||
|
||||
CREATE TABLE products
|
||||
(
|
||||
product_id UInt64,
|
||||
title String,
|
||||
)
|
||||
ENGINE = Dictionary(products)
|
||||
```
|
||||
|
||||
```
|
||||
Ok.
|
||||
|
||||
0 rows in set. Elapsed: 0.004 sec.
|
||||
Ok
|
||||
```
|
||||
|
||||
Take a look at what's in the table.
|
||||
|
||||
```sql
|
||||
select * from products limit 1;
|
||||
|
||||
SELECT *
|
||||
FROM products
|
||||
LIMIT 1
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌────product_id─┬─title───────────┐
|
||||
│ 152689 │ Some item │
|
||||
└───────────────┴─────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.006 sec.
|
||||
```
|
||||
|
||||
|
||||
|
@ -6,7 +6,7 @@ Reading is automatically parallelized. During a read, the table indexes on remot
|
||||
The Distributed engine accepts parameters: the cluster name in the server's config file, the name of a remote database, the name of a remote table, and (optionally) a sharding key.
|
||||
Example:
|
||||
|
||||
```
|
||||
```sql
|
||||
Distributed(logs, default, hits[, sharding_key])
|
||||
```
|
||||
|
||||
|
@ -32,9 +32,9 @@ The files specified in 'file' will be parsed by the format specified in 'format'
|
||||
Examples:
|
||||
|
||||
```bash
|
||||
echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8
|
||||
$ echo -ne "1\n2\n3\n" | clickhouse-client --query="SELECT count() FROM test.visits WHERE TraficSourceID IN _data" --external --file=- --types=Int8
|
||||
849897
|
||||
cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String'
|
||||
$ cat /etc/passwd | sed 's/:/\t/g' | clickhouse-client --query="SELECT shell, count() AS c FROM passwd GROUP BY shell ORDER BY c DESC" --external --file=- --name=passwd --structure='login String, unused String, uid UInt16, gid UInt16, comment String, home String, shell String'
|
||||
/bin/sh 20
|
||||
/bin/false 5
|
||||
/bin/bash 4
|
||||
@ -47,9 +47,9 @@ When using the HTTP interface, external data is passed in the multipart/form-dat
|
||||
Example:
|
||||
|
||||
```bash
|
||||
cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv
|
||||
$ cat /etc/passwd | sed 's/:/\t/g' > passwd.tsv
|
||||
|
||||
curl -F 'passwd=@passwd.tsv;' 'http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String'
|
||||
$ curl -F 'passwd=@passwd.tsv;' 'http://localhost:8123/?query=SELECT+shell,+count()+AS+c+FROM+passwd+GROUP+BY+shell+ORDER+BY+c+DESC&passwd_structure=login+String,+unused+String,+uid+UInt16,+gid+UInt16,+comment+String,+home+String,+shell+String'
|
||||
/bin/sh 20
|
||||
/bin/false 5
|
||||
/bin/bash 4
|
||||
|
@ -11,7 +11,7 @@ Usage examples:
|
||||
|
||||
## Usage in ClickHouse Server
|
||||
|
||||
```
|
||||
```sql
|
||||
File(Format)
|
||||
```
|
||||
|
||||
@ -53,7 +53,7 @@ two 2
|
||||
SELECT * FROM file_engine_table
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─┬─value─┐
|
||||
│ one │ 1 │
|
||||
│ two │ 2 │
|
||||
|
@ -89,7 +89,7 @@ patterns
|
||||
|
||||
Structure of the `patterns` section:
|
||||
|
||||
```
|
||||
```text
|
||||
pattern
|
||||
regexp
|
||||
function
|
||||
|
@ -5,7 +5,7 @@ to the [File](file.md) and [URL](url.md) engines, but provides Hadoop-specific f
|
||||
|
||||
## Usage
|
||||
|
||||
```
|
||||
```sql
|
||||
ENGINE = HDFS(URI, format)
|
||||
```
|
||||
The `URI` parameter is the whole file URI in HDFS.
|
||||
@ -33,7 +33,7 @@ INSERT INTO hdfs_engine_table VALUES ('one', 1), ('two', 2), ('three', 3)
|
||||
SELECT * FROM hdfs_engine_table LIMIT 2
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─┬─value─┐
|
||||
│ one │ 1 │
|
||||
│ two │ 2 │
|
||||
|
@ -27,7 +27,7 @@ ENGINE = JDBC(dbms_uri, external_database, external_table)
|
||||
|
||||
Creating a table in MySQL server by connecting directly with it's console client:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
@ -50,30 +50,29 @@ mysql> select * from test;
|
||||
|
||||
Creating a table in ClickHouse server and selecting data from it:
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE jdbc_table ENGINE JDBC('jdbc:mysql://localhost:3306/?user=root&password=root', 'test', 'test')
|
||||
|
||||
Ok.
|
||||
|
||||
```
|
||||
```sql
|
||||
DESCRIBE TABLE jdbc_table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name───────────────┬─type───────────────┬─default_type─┬─default_expression─┐
|
||||
│ int_id │ Int32 │ │ │
|
||||
│ int_nullable │ Nullable(Int32) │ │ │
|
||||
│ float │ Float32 │ │ │
|
||||
│ float_nullable │ Nullable(Float32) │ │ │
|
||||
└────────────────────┴────────────────────┴──────────────┴────────────────────┘
|
||||
|
||||
10 rows in set. Elapsed: 0.031 sec.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT *
|
||||
FROM jdbc_table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─int_id─┬─int_nullable─┬─float─┬─float_nullable─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │ 2 │ ᴺᵁᴸᴸ │
|
||||
└────────┴──────────────┴───────┴────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.055 sec.
|
||||
```
|
||||
|
||||
## See Also
|
||||
|
@ -4,7 +4,7 @@ Prepared data structure for using in [JOIN](../../query_language/select.md#selec
|
||||
|
||||
## Creating a Table
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
|
||||
|
@ -11,7 +11,7 @@ Kafka lets you:
|
||||
|
||||
## Creating a Table {#table_engine-kafka-creating-a-table}
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
|
||||
@ -79,7 +79,7 @@ Examples:
|
||||
Do not use this method in new projects. If possible, switch old projects to the method described above.
|
||||
|
||||
|
||||
```
|
||||
```sql
|
||||
Kafka(kafka_broker_list, kafka_topic_list, kafka_group_name, kafka_format
|
||||
[, kafka_row_delimiter, kafka_schema, kafka_num_consumers, kafka_skip_broken_messages])
|
||||
```
|
||||
@ -128,7 +128,7 @@ To improve performance, received messages are grouped into blocks the size of [m
|
||||
|
||||
To stop receiving topic data or to change the conversion logic, detach the materialized view:
|
||||
|
||||
```
|
||||
```sql
|
||||
DETACH TABLE consumer;
|
||||
ATTACH MATERIALIZED VIEW consumer;
|
||||
```
|
||||
|
@ -101,7 +101,7 @@ The `index_granularity` setting can be omitted because 8192 is the default value
|
||||
!!! attention
|
||||
Do not use this method in new projects. If possible, switch old projects to the method described above.
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
|
||||
@ -119,7 +119,7 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
MergeTree(EventDate, intHash32(UserID), (CounterID, EventDate, intHash32(UserID)), 8192)
|
||||
```
|
||||
|
||||
@ -370,14 +370,14 @@ The `TTL` clause can be set for the whole table and for each individual column.
|
||||
|
||||
The table must have the column in the [Date](../../data_types/date.md) or [DateTime](../../data_types/datetime.md) data type. To define the lifetime of data, use operations on this time column, for example:
|
||||
|
||||
```
|
||||
```sql
|
||||
TTL time_column
|
||||
TTL time_column + interval
|
||||
```
|
||||
|
||||
To define `interval`, use [time interval](../../query_language/operators.md#operators-datetime) operators.
|
||||
|
||||
```
|
||||
```sql
|
||||
TTL date_time + INTERVAL 1 MONTH
|
||||
TTL date_time + INTERVAL 15 HOUR
|
||||
```
|
||||
|
@ -45,7 +45,7 @@ The rest of the conditions and the `LIMIT` sampling constraint are executed in C
|
||||
|
||||
Table in MySQL:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
|
@ -8,7 +8,7 @@ This engine supports the [Nullable](../../data_types/nullable.md) data type.
|
||||
|
||||
## Creating a Table
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1],
|
||||
@ -41,15 +41,17 @@ Ensure that unixODBC and MySQL Connector are installed.
|
||||
|
||||
By default (if installed from packages), ClickHouse starts as user `clickhouse`. Thus, you need to create and configure this user in the MySQL server.
|
||||
|
||||
```bash
|
||||
$ sudo mysql
|
||||
```
|
||||
sudo mysql
|
||||
```sql
|
||||
mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse';
|
||||
mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'clickhouse' WITH GRANT OPTION;
|
||||
```
|
||||
|
||||
Then configure the connection in `/etc/odbc.ini`.
|
||||
|
||||
```
|
||||
```bash
|
||||
$ cat /etc/odbc.ini
|
||||
[mysqlconn]
|
||||
DRIVER = /usr/local/lib/libmyodbc5w.so
|
||||
@ -62,8 +64,8 @@ PASSWORD = clickhouse
|
||||
|
||||
You can check the connection using the `isql` utility from the unixODBC installation.
|
||||
|
||||
```
|
||||
isql -v mysqlconn
|
||||
```bash
|
||||
$ isql -v mysqlconn
|
||||
+---------------------------------------+
|
||||
| Connected! |
|
||||
| |
|
||||
@ -72,7 +74,7 @@ isql -v mysqlconn
|
||||
|
||||
Table in MySQL:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
|
@ -6,7 +6,7 @@ Use this engine in scenarios when you need to write many tables with a small amo
|
||||
|
||||
## Creating a Table {#table_engines-stripelog-creating-a-table}
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
|
||||
@ -60,7 +60,7 @@ ClickHouse uses multiple threads when selecting data. Each thread reads a separa
|
||||
```sql
|
||||
SELECT * FROM stripe_log_table
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
|
||||
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
|
||||
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
|
||||
@ -75,7 +75,7 @@ Sorting the results (ascending order by default):
|
||||
```sql
|
||||
SELECT * FROM stripe_log_table ORDER BY timestamp
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
|
||||
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
|
||||
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
|
||||
|
@ -7,7 +7,7 @@ We recommend to use the engine together with `MergeTree`. Store complete data in
|
||||
|
||||
## Creating a Table
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
|
||||
@ -38,7 +38,7 @@ When creating a `SummingMergeTree` table the same [clauses](mergetree.md) are re
|
||||
!!! attention
|
||||
Do not use this method in new projects and, if possible, switch the old projects to the method described above.
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
||||
(
|
||||
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
|
||||
@ -68,8 +68,8 @@ ORDER BY key
|
||||
|
||||
Insert data to it:
|
||||
|
||||
```
|
||||
:) INSERT INTO summtt Values(1,1),(1,2),(2,1)
|
||||
```sql
|
||||
INSERT INTO summtt Values(1,1),(1,2),(2,1)
|
||||
```
|
||||
|
||||
ClickHouse may sum all the rows not completely ([see below](#data-processing)), so we use an aggregate function `sum` and `GROUP BY` clause in the query.
|
||||
@ -78,7 +78,7 @@ ClickHouse may sum all the rows not completely ([see below](#data-processing)),
|
||||
SELECT key, sum(value) FROM summtt GROUP BY key
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─key─┬─sum(value)─┐
|
||||
│ 2 │ 1 │
|
||||
│ 1 │ 3 │
|
||||
@ -119,7 +119,7 @@ then this nested table is interpreted as a mapping of `key => (values...)`, and
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
```text
|
||||
[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
|
||||
[(1, 100)] + [(1, 150)] -> [(1, 250)]
|
||||
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
|
||||
|
@ -46,7 +46,7 @@ if __name__ == "__main__":
|
||||
```
|
||||
|
||||
```bash
|
||||
python3 server.py
|
||||
$ python3 server.py
|
||||
```
|
||||
|
||||
**3.** Request data:
|
||||
@ -55,7 +55,7 @@ python3 server.py
|
||||
SELECT * FROM url_engine_table
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─word──┬─value─┐
|
||||
│ Hello │ 1 │
|
||||
│ World │ 2 │
|
||||
|
@ -29,7 +29,7 @@ For a description of query parameters, see the [query description](../../query_l
|
||||
|
||||
**Engine Parameters**
|
||||
|
||||
```
|
||||
```sql
|
||||
VersionedCollapsingMergeTree(sign, version)
|
||||
```
|
||||
|
||||
@ -81,7 +81,7 @@ Use the `Sign` column when writing the row. If `Sign = 1` it means that the row
|
||||
|
||||
For example, we want to calculate how many pages users visited on some site and how long they were there. At some point in time we write the following row with the state of user activity:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 |
|
||||
└─────────────────────┴───────────┴──────────┴──────┴─────────┘
|
||||
@ -89,7 +89,7 @@ For example, we want to calculate how many pages users visited on some site and
|
||||
|
||||
At some point later we register the change of user activity and write it with the following two rows.
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 |
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 |
|
||||
@ -102,7 +102,7 @@ The second row contains the current state.
|
||||
|
||||
Because we need only the last state of user activity, the rows
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 |
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 |
|
||||
@ -139,7 +139,7 @@ If you need to extract the data with "collapsing" but without aggregation (for e
|
||||
|
||||
Example data:
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 |
|
||||
│ 4324182021466249494 │ 5 │ 146 │ -1 │ 1 |
|
||||
@ -175,11 +175,11 @@ We use two `INSERT` queries to create two different data parts. If we insert the
|
||||
|
||||
Getting the data:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM UAct
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 5 │ 146 │ 1 │ 1 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┴─────────┘
|
||||
@ -205,7 +205,7 @@ FROM UAct
|
||||
GROUP BY UserID, Version
|
||||
HAVING sum(Sign) > 0
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Version─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 2 │
|
||||
└─────────────────────┴───────────┴──────────┴─────────┘
|
||||
@ -216,7 +216,7 @@ If we don't need aggregation and want to force collapsing, we can use the `FINAL
|
||||
```sql
|
||||
SELECT * FROM UAct FINAL
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┬─Version─┐
|
||||
│ 4324182021466249494 │ 6 │ 185 │ 1 │ 2 │
|
||||
└─────────────────────┴───────────┴──────────┴──────┴─────────┘
|
||||
|
@ -5,7 +5,7 @@
|
||||
Always use the `performance` scaling governor. The `on-demand` scaling governor works much worse with constantly high demand.
|
||||
|
||||
```bash
|
||||
echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
$ echo 'performance' | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
||||
```
|
||||
|
||||
## CPU Limitations
|
||||
@ -20,8 +20,8 @@ For large amounts of data and when processing interactive (online) queries, you
|
||||
Even for data volumes of ~50 TB per server, using 128 GB of RAM significantly improves query performance compared to 64 GB.
|
||||
|
||||
Do not disable overcommit. The value `cat /proc/sys/vm/overcommit_memory` should be 0 or 1. Run
|
||||
```
|
||||
echo 0 | sudo tee /proc/sys/vm/overcommit_memory
|
||||
```bash
|
||||
$ echo 0 | sudo tee /proc/sys/vm/overcommit_memory
|
||||
```
|
||||
|
||||
## Huge Pages
|
||||
@ -29,7 +29,7 @@ echo 0 | sudo tee /proc/sys/vm/overcommit_memory
|
||||
Always disable transparent huge pages. It interferes with memory allocators, which leads to significant performance degradation.
|
||||
|
||||
```bash
|
||||
echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
|
||||
$ echo 'never' | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
|
||||
```
|
||||
|
||||
Use `perf top` to watch the time spent in the kernel for memory management.
|
||||
@ -54,7 +54,7 @@ If you have more than 4 disks, use RAID-6 (preferred) or RAID-50, instead of RAI
|
||||
When using RAID-5, RAID-6 or RAID-50, always increase stripe_cache_size, since the default value is usually not the best choice.
|
||||
|
||||
```bash
|
||||
echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size
|
||||
$ echo 4096 | sudo tee /sys/block/md2/md/stripe_cache_size
|
||||
```
|
||||
|
||||
Calculate the exact number from the number of devices and the block size, using the formula: `2 * num_devices * chunk_size_in_bytes / 4096`.
|
||||
@ -163,7 +163,7 @@ dynamicConfigFile=/etc/zookeeper-{{ cluster['name'] }}/conf/zoo.cfg.dynamic
|
||||
|
||||
Java version:
|
||||
|
||||
```
|
||||
```text
|
||||
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
|
||||
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
|
||||
```
|
||||
@ -211,7 +211,7 @@ JAVA_OPTS="-Xms{{ cluster.get('xms','128M') }} \
|
||||
|
||||
Salt init:
|
||||
|
||||
```
|
||||
```text
|
||||
description "zookeeper-{{ cluster['name'] }} centralized coordination service"
|
||||
|
||||
start on runlevel [2345]
|
||||
|
@ -26,14 +26,14 @@ Possible issues:
|
||||
|
||||
Command:
|
||||
|
||||
```
|
||||
sudo service clickhouse-server status
|
||||
```bash
|
||||
$ sudo service clickhouse-server status
|
||||
```
|
||||
|
||||
If the server is not running, start it with the command:
|
||||
|
||||
```
|
||||
sudo service clickhouse-server start
|
||||
```bash
|
||||
$ sudo service clickhouse-server start
|
||||
```
|
||||
|
||||
**Check logs**
|
||||
@ -47,19 +47,19 @@ If the server started successfully, you should see the strings:
|
||||
|
||||
If `clickhouse-server` start failed with a configuration error, you should see the `<Error>` string with an error description. For example:
|
||||
|
||||
```
|
||||
```text
|
||||
2019.01.11 15:23:25.549505 [ 45 ] {} <Error> ExternalDictionaries: Failed reloading 'event2id' external dictionary: Poco::Exception. Code: 1000, e.code() = 111, e.displayText() = Connection refused, e.what() = Connection refused
|
||||
```
|
||||
|
||||
If you don't see an error at the end of the file, look through the entire file starting from the string:
|
||||
|
||||
```
|
||||
```text
|
||||
<Information> Application: starting up.
|
||||
```
|
||||
|
||||
If you try to start a second instance of `clickhouse-server` on the server, you see the following log:
|
||||
|
||||
```
|
||||
```text
|
||||
2019.01.11 15:25:11.151730 [ 1 ] {} <Information> : Starting ClickHouse 19.1.0 with revision 54413
|
||||
2019.01.11 15:25:11.154578 [ 1 ] {} <Information> Application: starting up
|
||||
2019.01.11 15:25:11.156361 [ 1 ] {} <Information> StatusFile: Status file ./status already exists - unclean restart. Contents:
|
||||
@ -77,14 +77,14 @@ Revision: 54413
|
||||
|
||||
If you don't find any useful information in `clickhouse-server` logs or there aren't any logs, you can view `system.d` logs using the command:
|
||||
|
||||
```
|
||||
sudo journalctl -u clickhouse-server
|
||||
```bash
|
||||
$ sudo journalctl -u clickhouse-server
|
||||
```
|
||||
|
||||
**Start clickhouse-server in interactive mode**
|
||||
|
||||
```
|
||||
sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml
|
||||
```bash
|
||||
$ sudo -u clickhouse /usr/bin/clickhouse-server --config-file /etc/clickhouse-server/config.xml
|
||||
```
|
||||
|
||||
This command starts the server as an interactive app with standard parameters of the autostart script. In this mode `clickhouse-server` prints all the event messages in the console.
|
||||
|
@ -2,10 +2,10 @@
|
||||
|
||||
If ClickHouse was installed from deb packages, execute the following commands on the server:
|
||||
|
||||
```
|
||||
sudo apt-get update
|
||||
sudo apt-get install clickhouse-client clickhouse-server
|
||||
sudo service clickhouse-server restart
|
||||
```bash
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install clickhouse-client clickhouse-server
|
||||
$ sudo service clickhouse-server restart
|
||||
```
|
||||
|
||||
If you installed ClickHouse using something other than the recommended deb packages, use the appropriate update method.
|
||||
|
@ -24,7 +24,7 @@ To reduce network traffic, we recommend running `clickhouse-copier` on the same
|
||||
The utility should be run manually:
|
||||
|
||||
```bash
|
||||
clickhouse-copier copier --daemon --config zookeeper.xml --task-path /task/path --base-dir /path/to/dir
|
||||
$ clickhouse-copier copier --daemon --config zookeeper.xml --task-path /task/path --base-dir /path/to/dir
|
||||
```
|
||||
|
||||
Parameters:
|
||||
|
@ -18,7 +18,7 @@ By default `clickhouse-local` does not have access to data on the same host, but
|
||||
Basic usage:
|
||||
|
||||
```bash
|
||||
clickhouse-local --structure "table_structure" --input-format "format_of_incoming_data" -q "query"
|
||||
$ clickhouse-local --structure "table_structure" --input-format "format_of_incoming_data" -q "query"
|
||||
```
|
||||
|
||||
Arguments:
|
||||
@ -41,7 +41,7 @@ Also there are arguments for each ClickHouse configuration variable which are mo
|
||||
## Examples
|
||||
|
||||
```bash
|
||||
echo -e "1,2\n3,4" | clickhouse-local -S "a Int64, b Int64" -if "CSV" -q "SELECT * FROM table"
|
||||
$ echo -e "1,2\n3,4" | clickhouse-local -S "a Int64, b Int64" -if "CSV" -q "SELECT * FROM table"
|
||||
Read 2 rows, 32.00 B in 0.000 sec., 5182 rows/sec., 80.97 KiB/sec.
|
||||
1 2
|
||||
3 4
|
||||
@ -60,6 +60,8 @@ Now let's output memory user for each Unix user:
|
||||
|
||||
```bash
|
||||
$ ps aux | tail -n +2 | awk '{ printf("%s\t%s\n", $1, $4) }' | clickhouse-local -S "user String, mem Float64" -q "SELECT user, round(sum(mem), 2) as memTotal FROM table GROUP BY user ORDER BY memTotal DESC FORMAT Pretty"
|
||||
```
|
||||
```text
|
||||
Read 186 rows, 4.15 KiB in 0.035 sec., 5302 rows/sec., 118.34 KiB/sec.
|
||||
┏━━━━━━━━━━┳━━━━━━━━━━┓
|
||||
┃ user ┃ memTotal ┃
|
||||
|
@ -48,7 +48,7 @@ Converts an aggregate function for tables into an aggregate function for arrays
|
||||
|
||||
Allows to divide data by groups, and then separately aggregates the data in those groups. Groups are created by splitting the values of one of the columns into intervals.
|
||||
|
||||
```
|
||||
```sql
|
||||
<aggFunction>Resample(start, end, step)(<aggFunction_params>, resampling_key)
|
||||
```
|
||||
|
||||
|
@ -15,7 +15,7 @@ During aggregation, all `NULL`s are skipped.
|
||||
|
||||
Consider this table:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ 2 │
|
||||
│ 2 │ ᴺᵁᴸᴸ │
|
||||
@ -27,34 +27,27 @@ Consider this table:
|
||||
|
||||
Let's say you need to total the values in the `y` column:
|
||||
|
||||
```sql
|
||||
SELECT sum(y) FROM t_null_big
|
||||
```
|
||||
```
|
||||
:) SELECT sum(y) FROM t_null_big
|
||||
|
||||
SELECT sum(y)
|
||||
FROM t_null_big
|
||||
|
||||
┌─sum(y)─┐
|
||||
│ 7 │
|
||||
└────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
The `sum` function interprets `NULL` as `0`. In particular, this means that if the function receives input of a selection where all the values are `NULL`, then the result will be `0`, not `NULL`.
|
||||
|
||||
Now you can use the `groupArray` function to create an array from the `y` column:
|
||||
|
||||
```sql
|
||||
SELECT groupArray(y) FROM t_null_big
|
||||
```
|
||||
:) SELECT groupArray(y) FROM t_null_big
|
||||
|
||||
SELECT groupArray(y)
|
||||
FROM t_null_big
|
||||
|
||||
```text
|
||||
┌─groupArray(y)─┐
|
||||
│ [2,2,3] │
|
||||
└───────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
`groupArray` does not include `NULL` in the resulting array.
|
||||
|
@ -6,7 +6,7 @@ Some aggregate functions can accept not only argument columns (used for compress
|
||||
|
||||
Calculates an adaptive histogram. It doesn't guarantee precise results.
|
||||
|
||||
```
|
||||
```sql
|
||||
histogram(number_of_bins)(values)
|
||||
```
|
||||
|
||||
@ -90,7 +90,7 @@ Example: `sequenceMatch ('(?1).*(?2)')(EventTime, URL LIKE '%company%', URL LIKE
|
||||
|
||||
This is a singular example. You could write it using other aggregate functions:
|
||||
|
||||
```
|
||||
```sql
|
||||
minIf(EventTime, URL LIKE '%company%') < maxIf(EventTime, URL LIKE '%cart%').
|
||||
```
|
||||
|
||||
@ -153,7 +153,7 @@ Set the following chain of events:
|
||||
|
||||
To find out how far the user `user_id` could get through the chain in an hour in January of 2017, make the query:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT
|
||||
level,
|
||||
count() AS c
|
||||
@ -184,7 +184,7 @@ Consider you are doing a website analytics, intend to calculate the retention of
|
||||
|
||||
This could be easily calculate by `retention`
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT
|
||||
sum(r[1]) AS r1,
|
||||
sum(r[2]) AS r2,
|
||||
@ -218,7 +218,7 @@ It works as fast as possible, except for cases when a large N value is used and
|
||||
|
||||
Usage example:
|
||||
|
||||
```
|
||||
```text
|
||||
Problem: Generate a report that shows only keywords that produced at least 5 unique users.
|
||||
Solution: Write in the GROUP BY query SearchPhrase HAVING uniqUpTo(4)(UserID) >= 5
|
||||
```
|
||||
|
@ -79,7 +79,7 @@ When a `SELECT` query has the `GROUP BY` clause or at least one aggregate functi
|
||||
|
||||
Selects a frequently occurring value using the [heavy hitters](http://www.cs.umd.edu/~samir/498/karp.pdf) algorithm. If there is a value that occurs more than in half the cases in each of the query's execution threads, this value is returned. Normally, the result is nondeterministic.
|
||||
|
||||
```
|
||||
```sql
|
||||
anyHeavy(column)
|
||||
```
|
||||
|
||||
@ -96,7 +96,7 @@ SELECT anyHeavy(AirlineID) AS res
|
||||
FROM ontime
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌───res─┐
|
||||
│ 19690 │
|
||||
└───────┘
|
||||
@ -111,7 +111,7 @@ The result is just as indeterminate as for the `any` function.
|
||||
|
||||
Applies bitwise `AND` for series of numbers.
|
||||
|
||||
```
|
||||
```sql
|
||||
groupBitAnd(expr)
|
||||
```
|
||||
|
||||
@ -127,7 +127,7 @@ Value of the `UInt*` type.
|
||||
|
||||
Test data:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
00101100 = 44
|
||||
00011100 = 28
|
||||
@ -137,7 +137,7 @@ binary decimal
|
||||
|
||||
Query:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT groupBitAnd(num) FROM t
|
||||
```
|
||||
|
||||
@ -145,7 +145,7 @@ Where `num` is the column with the test data.
|
||||
|
||||
Result:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
00000100 = 4
|
||||
```
|
||||
@ -154,7 +154,7 @@ binary decimal
|
||||
|
||||
Applies bitwise `OR` for series of numbers.
|
||||
|
||||
```
|
||||
```sql
|
||||
groupBitOr(expr)
|
||||
```
|
||||
|
||||
@ -170,7 +170,7 @@ Value of the `UInt*` type.
|
||||
|
||||
Test data:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
00101100 = 44
|
||||
00011100 = 28
|
||||
@ -180,7 +180,7 @@ binary decimal
|
||||
|
||||
Query:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT groupBitOr(num) FROM t
|
||||
```
|
||||
|
||||
@ -188,7 +188,7 @@ Where `num` is the column with the test data.
|
||||
|
||||
Result:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
01111101 = 125
|
||||
```
|
||||
@ -197,7 +197,7 @@ binary decimal
|
||||
|
||||
Applies bitwise `XOR` for series of numbers.
|
||||
|
||||
```
|
||||
```sql
|
||||
groupBitXor(expr)
|
||||
```
|
||||
|
||||
@ -213,7 +213,7 @@ Value of the `UInt*` type.
|
||||
|
||||
Test data:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
00101100 = 44
|
||||
00011100 = 28
|
||||
@ -223,7 +223,7 @@ binary decimal
|
||||
|
||||
Query:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT groupBitXor(num) FROM t
|
||||
```
|
||||
|
||||
@ -231,7 +231,7 @@ Where `num` is the column with the test data.
|
||||
|
||||
Result:
|
||||
|
||||
```
|
||||
```text
|
||||
binary decimal
|
||||
01101000 = 104
|
||||
```
|
||||
@ -241,7 +241,7 @@ binary decimal
|
||||
|
||||
Bitmap or Aggregate calculations from a unsigned integer column, return cardinality of type UInt64, if add suffix -State, then return [bitmap object](../functions/bitmap_functions.md).
|
||||
|
||||
```
|
||||
```sql
|
||||
groupBitmap(expr)
|
||||
```
|
||||
|
||||
@ -257,7 +257,7 @@ Value of the `UInt64` type.
|
||||
|
||||
Test data:
|
||||
|
||||
```
|
||||
```text
|
||||
UserID
|
||||
1
|
||||
1
|
||||
@ -267,13 +267,13 @@ UserID
|
||||
|
||||
Query:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT groupBitmap(UserID) as num FROM t
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
```
|
||||
```text
|
||||
num
|
||||
3
|
||||
```
|
||||
@ -291,15 +291,17 @@ Calculates the maximum.
|
||||
Calculates the 'arg' value for a minimal 'val' value. If there are several different values of 'arg' for minimal values of 'val', the first of these values encountered is output.
|
||||
|
||||
**Example:**
|
||||
```
|
||||
```text
|
||||
┌─user─────┬─salary─┐
|
||||
│ director │ 5000 │
|
||||
│ manager │ 3000 │
|
||||
│ worker │ 1000 │
|
||||
└──────────┴────────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT argMin(user, salary) FROM salary
|
||||
|
||||
```
|
||||
```text
|
||||
┌─argMin(user, salary)─┐
|
||||
│ worker │
|
||||
└──────────────────────┘
|
||||
@ -351,7 +353,7 @@ FROM sum_map
|
||||
GROUP BY timeslot
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┐
|
||||
│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10]) │
|
||||
│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10]) │
|
||||
@ -362,7 +364,7 @@ GROUP BY timeslot
|
||||
|
||||
Computes the [skewness](https://en.wikipedia.org/wiki/Skewness) of a sequence.
|
||||
|
||||
```
|
||||
```sql
|
||||
skewPop(expr)
|
||||
```
|
||||
|
||||
@ -386,7 +388,7 @@ Computes the [sample skewness](https://en.wikipedia.org/wiki/Skewness) of a sequ
|
||||
|
||||
It represents an unbiased estimate of the skewness of a random variable if passed values form its sample.
|
||||
|
||||
```
|
||||
```sql
|
||||
skewSamp(expr)
|
||||
```
|
||||
|
||||
@ -408,7 +410,7 @@ SELECT skewSamp(value) FROM series_with_value_column
|
||||
|
||||
Computes the [kurtosis](https://en.wikipedia.org/wiki/Kurtosis) of a sequence.
|
||||
|
||||
```
|
||||
```sql
|
||||
kurtPop(expr)
|
||||
```
|
||||
|
||||
@ -432,7 +434,7 @@ Computes the [sample kurtosis](https://en.wikipedia.org/wiki/Kurtosis) of a sequ
|
||||
|
||||
It represents an unbiased estimate of the kurtosis of a random variable if passed values form its sample.
|
||||
|
||||
```
|
||||
```sql
|
||||
kurtSamp(expr)
|
||||
```
|
||||
|
||||
@ -463,7 +465,7 @@ The function returns array of tuples with `(timestamp, aggregated_value)` pairs.
|
||||
Before using this function make sure `timestamp` is in ascending order.
|
||||
|
||||
Example:
|
||||
```
|
||||
```text
|
||||
┌─uid─┬─timestamp─┬─value─┐
|
||||
│ 1 │ 2 │ 0.2 │
|
||||
│ 1 │ 7 │ 0.7 │
|
||||
@ -477,7 +479,7 @@ Example:
|
||||
│ 2 │ 24 │ 4.8 │
|
||||
└─────┴───────────┴───────┘
|
||||
```
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE time_series(
|
||||
uid UInt64,
|
||||
timestamp Int64,
|
||||
@ -493,7 +495,7 @@ FROM (
|
||||
);
|
||||
```
|
||||
And the result will be:
|
||||
```
|
||||
```text
|
||||
[(2,0.2),(3,0.9),(7,2.1),(8,2.4),(12,3.6),(17,5.1),(18,5.4),(24,7.2),(25,2.5)]
|
||||
```
|
||||
|
||||
@ -502,7 +504,7 @@ Similarly timeSeriesGroupRateSum, timeSeriesGroupRateSum will Calculate the rate
|
||||
Also, timestamp should be in ascend order before use this function.
|
||||
|
||||
Use this function, the result above case will be:
|
||||
```
|
||||
```text
|
||||
[(2,0),(3,0.1),(7,0.3),(8,0.3),(12,0.3),(17,0.3),(18,0.3),(24,0.3),(25,0.1)]
|
||||
```
|
||||
|
||||
@ -516,7 +518,7 @@ The result is always Float64.
|
||||
|
||||
Calculates the approximate number of different values of the argument.
|
||||
|
||||
```
|
||||
```sql
|
||||
uniq(x[, ...])
|
||||
```
|
||||
|
||||
@ -551,7 +553,7 @@ We recommend using this function in almost all scenarios.
|
||||
|
||||
Calculates the approximate number of different argument values.
|
||||
|
||||
```
|
||||
```sql
|
||||
uniqCombined(HLL_precision)(x[, ...])
|
||||
```
|
||||
|
||||
@ -595,7 +597,7 @@ Compared to the [uniq](#agg_function-uniq) function, the `uniqCombined`:
|
||||
|
||||
Calculates the approximate number of different argument values, using the [HyperLogLog](https://en.wikipedia.org/wiki/HyperLogLog) algorithm.
|
||||
|
||||
```
|
||||
```sql
|
||||
uniqHLL12(x[, ...])
|
||||
```
|
||||
|
||||
@ -631,7 +633,7 @@ We don't recommend using this function. In most cases, use the [uniq](#agg_funct
|
||||
|
||||
Calculates the exact number of different argument values.
|
||||
|
||||
```
|
||||
```sql
|
||||
uniqExact(x[, ...])
|
||||
```
|
||||
|
||||
@ -676,7 +678,7 @@ Optional parameters:
|
||||
|
||||
Calculates the moving sum of input values.
|
||||
|
||||
```
|
||||
```sql
|
||||
groupArrayMovingSum(numbers_for_summing)
|
||||
groupArrayMovingSum(window_size)(numbers_for_summing)
|
||||
```
|
||||
@ -745,7 +747,7 @@ FROM t
|
||||
|
||||
Calculates the moving average of input values.
|
||||
|
||||
```
|
||||
```sql
|
||||
groupArrayMovingAvg(numbers_for_summing)
|
||||
groupArrayMovingAvg(window_size)(numbers_for_summing)
|
||||
```
|
||||
@ -850,7 +852,7 @@ Don't use this function for calculating timings. There is a more suitable functi
|
||||
|
||||
Computes the quantile of the specified level with determined precision. The function intended for calculating quantiles of page loading time in milliseconds.
|
||||
|
||||
```
|
||||
```sql
|
||||
quantileTiming(level)(expr)
|
||||
```
|
||||
|
||||
@ -955,7 +957,7 @@ Returns an array of the most frequent values in the specified column. The result
|
||||
|
||||
Implements the [ Filtered Space-Saving](http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/misnis.ref0a.pdf) algorithm for analyzing TopK, based on the reduce-and-combine algorithm from [Parallel Space Saving](https://arxiv.org/pdf/1401.0702.pdf).
|
||||
|
||||
```
|
||||
```sql
|
||||
topK(N)(column)
|
||||
```
|
||||
|
||||
@ -977,7 +979,7 @@ SELECT topK(3)(AirlineID) AS res
|
||||
FROM ontime
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────────────┐
|
||||
│ [19393,19790,19805] │
|
||||
└─────────────────────┘
|
||||
@ -1001,7 +1003,7 @@ Calculates the Pearson correlation coefficient: `Σ((x - x̅)(y - y̅)) / sqrt(
|
||||
|
||||
Performs simple (unidimensional) linear regression.
|
||||
|
||||
```
|
||||
```sql
|
||||
simpleLinearRegression(x, y)
|
||||
```
|
||||
|
||||
|
@ -171,7 +171,7 @@ Also, they are replicated (syncing indices metadata through ZooKeeper).
|
||||
See more on [constraints](create.md#constraints)
|
||||
|
||||
Constraints could be added or deleted using following syntax:
|
||||
```
|
||||
```sql
|
||||
ALTER TABLE [db].name ADD CONSTRAINT constraint_name CHECK expression;
|
||||
ALTER TABLE [db].name DROP CONSTRAINT constraint_name;
|
||||
```
|
||||
|
@ -112,7 +112,7 @@ This storage method works the same way as hashed and allows using date/time (arb
|
||||
|
||||
Example: The table contains discounts for each advertiser in the format:
|
||||
|
||||
```
|
||||
```text
|
||||
+---------------+---------------------+-------------------+--------+
|
||||
| advertiser id | discount start date | discount end date | amount |
|
||||
+===============+=====================+===================+========+
|
||||
@ -146,7 +146,7 @@ Example:
|
||||
|
||||
To work with these dictionaries, you need to pass an additional argument to the `dictGetT` function, for which a range is selected:
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGetT('dict_name', 'attr_name', id, date)
|
||||
```
|
||||
|
||||
@ -240,7 +240,7 @@ This type of storage is for mapping network prefixes (IP addresses) to metadata
|
||||
|
||||
Example: The table contains network prefixes and their corresponding AS number and country code:
|
||||
|
||||
```
|
||||
```text
|
||||
+-----------------+-------+--------+
|
||||
| prefix | asn | cca2 |
|
||||
+=================+=======+========+
|
||||
@ -283,13 +283,13 @@ The key must have only one String type attribute that contains an allowed IP pre
|
||||
|
||||
For queries, you must use the same functions (`dictGetT` with a tuple) as for dictionaries with composite keys:
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGetT('dict_name', 'attr_name', tuple(ip))
|
||||
```
|
||||
|
||||
The function takes either `UInt32` for IPv4, or `FixedString(16)` for IPv6:
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGetString('prefix', 'asn', tuple(IPv6StringToNum('2001:db8::1')))
|
||||
```
|
||||
|
||||
|
@ -131,7 +131,7 @@ If you have a problems with encodings when using Oracle, see the corresponding [
|
||||
|
||||
Let's configure unixODBC for PostgreSQL. Content of `/etc/odbc.ini`:
|
||||
|
||||
```
|
||||
```text
|
||||
[gregtest]
|
||||
Driver = /usr/lib/psqlodbca.so
|
||||
Servername = localhost
|
||||
@ -144,7 +144,7 @@ PASSWORD = test
|
||||
|
||||
If you then make a query such as
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM odbc('DSN=gregtest;Servername=some-server.com', 'test_db');
|
||||
```
|
||||
|
||||
@ -155,12 +155,13 @@ ODBC driver will send values of `USERNAME` and `PASSWORD` from `odbc.ini` to `so
|
||||
Ubuntu OS.
|
||||
|
||||
Installing unixODBC and the ODBC driver for PostgreSQL:
|
||||
|
||||
sudo apt-get install -y unixodbc odbcinst odbc-postgresql
|
||||
```bash
|
||||
$ sudo apt-get install -y unixodbc odbcinst odbc-postgresql
|
||||
```
|
||||
|
||||
Configuring `/etc/odbc.ini` (or `~/.odbc.ini`):
|
||||
|
||||
```
|
||||
```text
|
||||
[DEFAULT]
|
||||
Driver = myconnection
|
||||
|
||||
@ -222,13 +223,13 @@ Ubuntu OS.
|
||||
|
||||
Installing the driver: :
|
||||
|
||||
```
|
||||
sudo apt-get install tdsodbc freetds-bin sqsh
|
||||
```bash
|
||||
$ sudo apt-get install tdsodbc freetds-bin sqsh
|
||||
```
|
||||
|
||||
Configuring the driver: :
|
||||
Configuring the driver:
|
||||
|
||||
```
|
||||
```bash
|
||||
$ cat /etc/freetds/freetds.conf
|
||||
...
|
||||
|
||||
|
@ -8,7 +8,7 @@ Example:
|
||||
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
|
||||
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │
|
||||
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘
|
||||
|
@ -49,7 +49,7 @@ Returns an 'Array(T)' type result, where 'T' is the smallest common type out of
|
||||
|
||||
Combines arrays passed as arguments.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayConcat(arrays)
|
||||
```
|
||||
|
||||
@ -82,9 +82,10 @@ Returns 0 if the the element is not in the array, or 1 if it is.
|
||||
|
||||
`NULL` is processed as a value.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT has([1, 2, NULL], NULL)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─has([1, 2, NULL], NULL)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────┘
|
||||
@ -94,7 +95,7 @@ SELECT has([1, 2, NULL], NULL)
|
||||
|
||||
Checks whether one array is a subset of another.
|
||||
|
||||
```
|
||||
```sql
|
||||
hasAll(set, subset)
|
||||
```
|
||||
|
||||
@ -132,7 +133,7 @@ hasAll(set, subset)
|
||||
|
||||
Checks whether two arrays have intersection by some elements.
|
||||
|
||||
```
|
||||
```sql
|
||||
hasAny(array1, array2)
|
||||
```
|
||||
|
||||
@ -169,10 +170,10 @@ Returns the index of the first 'x' element (starting from 1) if it is in the arr
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
:) SELECT indexOf([1,3,NULL,NULL],NULL)
|
||||
|
||||
```sql
|
||||
SELECT indexOf([1, 3, NULL, NULL], NULL)
|
||||
```
|
||||
```text
|
||||
|
||||
┌─indexOf([1, 3, NULL, NULL], NULL)─┐
|
||||
│ 3 │
|
||||
@ -189,9 +190,10 @@ Returns the number of elements in the array equal to x. Equivalent to arrayCount
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT countEqual([1, 2, NULL, NULL], NULL)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─countEqual([1, 2, NULL, NULL], NULL)─┐
|
||||
│ 2 │
|
||||
└──────────────────────────────────────┘
|
||||
@ -293,7 +295,7 @@ This is necessary when using ARRAY JOIN with a nested data structure and further
|
||||
|
||||
Removes the last item from the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayPopBack(array)
|
||||
```
|
||||
|
||||
@ -316,7 +318,7 @@ SELECT arrayPopBack([1, 2, 3]) AS res
|
||||
|
||||
Removes the first item from the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayPopFront(array)
|
||||
```
|
||||
|
||||
@ -339,7 +341,7 @@ SELECT arrayPopFront([1, 2, 3]) AS res
|
||||
|
||||
Adds one item to the end of the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayPushBack(array, single_value)
|
||||
```
|
||||
|
||||
@ -363,7 +365,7 @@ SELECT arrayPushBack(['a'], 'b') AS res
|
||||
|
||||
Adds one element to the beginning of the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayPushFront(array, single_value)
|
||||
```
|
||||
|
||||
@ -387,7 +389,7 @@ SELECT arrayPushBack(['b'], 'a') AS res
|
||||
|
||||
Changes the length of the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arrayResize(array, size[, extender])
|
||||
```
|
||||
|
||||
@ -405,17 +407,19 @@ An array of length `size`.
|
||||
|
||||
**Examples of calls**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT arrayResize([1], 3)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─arrayResize([1], 3)─┐
|
||||
│ [1,0,0] │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT arrayResize([1], 3, NULL)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─arrayResize([1], 3, NULL)─┐
|
||||
│ [1,NULL,NULL] │
|
||||
└───────────────────────────┘
|
||||
@ -425,7 +429,7 @@ SELECT arrayResize([1], 3, NULL)
|
||||
|
||||
Returns a slice of the array.
|
||||
|
||||
```
|
||||
```sql
|
||||
arraySlice(array, offset[, length])
|
||||
```
|
||||
|
||||
@ -653,7 +657,7 @@ Takes an array, returns an array with the difference between all pairs of neighb
|
||||
SELECT arrayDifference([1, 2, 3, 4])
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─arrayDifference([1, 2, 3, 4])─┐
|
||||
│ [0,1,1,1] │
|
||||
└───────────────────────────────┘
|
||||
@ -667,7 +671,7 @@ Takes an array, returns an array containing the different elements in all the ar
|
||||
SELECT arrayDistinct([1, 2, 2, 3, 1])
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─arrayDistinct([1, 2, 2, 3, 1])─┐
|
||||
│ [1,2,3] │
|
||||
└────────────────────────────────┘
|
||||
@ -687,7 +691,7 @@ SELECT
|
||||
arrayIntersect([1, 2], [1, 3], [1, 4]) AS intersect
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─no_intersect─┬─intersect─┐
|
||||
│ [] │ [1] │
|
||||
└──────────────┴───────────┘
|
||||
|
@ -19,7 +19,7 @@ Example:
|
||||
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─dst─┬─\'Hello\'─┬─src─────┐
|
||||
│ 1 │ Hello │ [1,2,3] │
|
||||
│ 2 │ Hello │ [1,2,3] │
|
||||
|
@ -13,7 +13,7 @@ For more information on RoaringBitmap, see: [CRoaring](https://github.com/Roarin
|
||||
|
||||
Build a bitmap from unsigned integer array.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapBuild(array)
|
||||
```
|
||||
|
||||
@ -36,7 +36,7 @@ SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res)
|
||||
|
||||
Convert bitmap to integer array.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapToArray(bitmap)
|
||||
```
|
||||
|
||||
@ -50,7 +50,7 @@ bitmapToArray(bitmap)
|
||||
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────┐
|
||||
│ [1,2,3,4,5] │
|
||||
└─────────────┘
|
||||
@ -60,7 +60,7 @@ SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
|
||||
Return subset in specified range (not include the range_end).
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapSubsetInRange(bitmap, range_start, range_end)
|
||||
```
|
||||
|
||||
@ -76,7 +76,7 @@ bitmapSubsetInRange(bitmap, range_start, range_end)
|
||||
SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res───────────────┐
|
||||
│ [30,31,32,33,100] │
|
||||
└───────────────────┘
|
||||
@ -112,7 +112,7 @@ SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12
|
||||
|
||||
Checks whether the bitmap contains an element.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapContains(haystack, needle)
|
||||
```
|
||||
|
||||
@ -143,7 +143,7 @@ SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res
|
||||
|
||||
Checks whether two bitmaps have intersection by some elements.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapHasAny(bitmap1, bitmap2)
|
||||
```
|
||||
|
||||
@ -164,7 +164,7 @@ If you are sure that `bitmap2` contains strictly one element, consider using the
|
||||
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
@ -175,7 +175,7 @@ SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
||||
Analogous to `hasAll(array, array)` returns 1 if the first bitmap contains all the elements of the second one, 0 otherwise.
|
||||
If the second argument is an empty bitmap then returns 1.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapHasAll(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -189,7 +189,7 @@ bitmapHasAll(bitmap,bitmap)
|
||||
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 0 │
|
||||
└─────┘
|
||||
@ -200,7 +200,7 @@ SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
||||
|
||||
Two bitmap and calculation, the result is a new bitmap.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapAnd(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -214,7 +214,7 @@ bitmapAnd(bitmap,bitmap)
|
||||
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ [3] │
|
||||
└─────┘
|
||||
@ -225,7 +225,7 @@ SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS re
|
||||
|
||||
Two bitmap or calculation, the result is a new bitmap.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapOr(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -239,7 +239,7 @@ bitmapOr(bitmap,bitmap)
|
||||
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────┐
|
||||
│ [1,2,3,4,5] │
|
||||
└─────────────┘
|
||||
@ -249,7 +249,7 @@ SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
||||
|
||||
Two bitmap xor calculation, the result is a new bitmap.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapXor(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -263,7 +263,7 @@ bitmapXor(bitmap,bitmap)
|
||||
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res───────┐
|
||||
│ [1,2,4,5] │
|
||||
└───────────┘
|
||||
@ -273,7 +273,7 @@ SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS re
|
||||
|
||||
Two bitmap andnot calculation, the result is a new bitmap.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapAndnot(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -287,7 +287,7 @@ bitmapAndnot(bitmap,bitmap)
|
||||
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res───┐
|
||||
│ [1,2] │
|
||||
└───────┘
|
||||
@ -298,7 +298,7 @@ SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS
|
||||
Retrun bitmap cardinality of type UInt64.
|
||||
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapCardinality(bitmap)
|
||||
```
|
||||
|
||||
@ -312,7 +312,7 @@ bitmapCardinality(bitmap)
|
||||
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 5 │
|
||||
└─────┘
|
||||
@ -373,7 +373,7 @@ SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
Two bitmap and calculation, return cardinality of type UInt64.
|
||||
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapAndCardinality(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -387,7 +387,7 @@ bitmapAndCardinality(bitmap,bitmap)
|
||||
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
@ -398,7 +398,7 @@ SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
|
||||
Two bitmap or calculation, return cardinality of type UInt64.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapOrCardinality(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -412,7 +412,7 @@ bitmapOrCardinality(bitmap,bitmap)
|
||||
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 5 │
|
||||
└─────┘
|
||||
@ -422,7 +422,7 @@ SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
|
||||
Two bitmap xor calculation, return cardinality of type UInt64.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapXorCardinality(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -436,7 +436,7 @@ bitmapXorCardinality(bitmap,bitmap)
|
||||
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 4 │
|
||||
└─────┘
|
||||
@ -447,7 +447,7 @@ SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
|
||||
Two bitmap andnot calculation, return cardinality of type UInt64.
|
||||
|
||||
```
|
||||
```sql
|
||||
bitmapAndnotCardinality(bitmap,bitmap)
|
||||
```
|
||||
|
||||
@ -461,7 +461,7 @@ bitmapAndnotCardinality(bitmap,bitmap)
|
||||
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 2 │
|
||||
└─────┘
|
||||
|
@ -11,7 +11,7 @@ Returns `then` if `cond != 0`, or `else` if `cond = 0`.
|
||||
|
||||
Allows you to write the [CASE](../operators.md#operator_case) operator more compactly in the query.
|
||||
|
||||
```
|
||||
```sql
|
||||
multiIf(cond_1, then_1, cond_2, then_2...else)
|
||||
```
|
||||
|
||||
@ -31,7 +31,7 @@ The function returns one of the values `then_N` or `else`, depending on the cond
|
||||
|
||||
Take the table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 3 │
|
||||
@ -40,7 +40,7 @@ Take the table
|
||||
|
||||
Run the query `SELECT multiIf(isNull(y) x, y < 3, y, NULL) FROM t_null`. Result:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─multiIf(isNull(y), x, less(y, 3), y, NULL)─┐
|
||||
│ 1 │
|
||||
│ ᴺᵁᴸᴸ │
|
||||
|
@ -12,7 +12,7 @@ SELECT
|
||||
toString(time, 'US/Samoa') AS time_samoa
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐
|
||||
│ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │
|
||||
└─────────────────────┴────────────┴────────────┴─────────────────────┘
|
||||
@ -201,7 +201,7 @@ For mode values with a meaning of “with 4 or more days this year,” weeks are
|
||||
|
||||
For mode values with a meaning of “contains January 1”, the week contains January 1 is week 1. It doesn't matter how many days in the new year the week contained, even if it contained only one day.
|
||||
|
||||
```
|
||||
```sql
|
||||
toWeek(date, [, mode][, Timezone])
|
||||
```
|
||||
**Parameters**
|
||||
@ -216,7 +216,7 @@ toWeek(date, [, mode][, Timezone])
|
||||
SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date,1) AS week1, toWeek(date,9) AS week9;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────date─┬─week0─┬─week1─┬─week9─┐
|
||||
│ 2016-12-27 │ 52 │ 52 │ 1 │
|
||||
└────────────┴───────┴───────┴───────┘
|
||||
@ -235,7 +235,7 @@ The mode argument works exactly like the mode argument to toWeek(). For the sing
|
||||
SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date,1) AS yearWeek1, toYearWeek(date,9) AS yearWeek9;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┐
|
||||
│ 2016-12-27 │ 201652 │ 201652 │ 201701 │
|
||||
└────────────┴───────────┴───────────┴───────────┘
|
||||
@ -286,7 +286,7 @@ SELECT
|
||||
addYears(date_time, 1) AS add_years_with_date_time
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─add_years_with_date─┬─add_years_with_date_time─┐
|
||||
│ 2019-01-01 │ 2019-01-01 00:00:00 │
|
||||
└─────────────────────┴──────────────────────────┘
|
||||
@ -305,7 +305,7 @@ SELECT
|
||||
subtractYears(date_time, 1) AS subtract_years_with_date_time
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─subtract_years_with_date─┬─subtract_years_with_date_time─┐
|
||||
│ 2018-01-01 │ 2018-01-01 00:00:00 │
|
||||
└──────────────────────────┴───────────────────────────────┘
|
||||
|
@ -6,7 +6,7 @@ For information on connecting and configuring external dictionaries, see [Extern
|
||||
|
||||
Retrieves a value from an external dictionary.
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGet('dict_name', 'attr_name', id_expr)
|
||||
dictGetOrDefault('dict_name', 'attr_name', id_expr, default_value_expr)
|
||||
```
|
||||
@ -95,7 +95,7 @@ LIMIT 3
|
||||
|
||||
Checks whether a key is present in a dictionary.
|
||||
|
||||
```
|
||||
```sql
|
||||
dictHas('dict_name', id_expr)
|
||||
```
|
||||
|
||||
@ -115,7 +115,7 @@ Type: `UInt8`.
|
||||
|
||||
For the hierarchical dictionary, returns an array of dictionary keys starting from the passed `id_expr` and continuing along the chain of parent elements.
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGetHierarchy('dict_name', id_expr)
|
||||
```
|
||||
|
||||
@ -134,7 +134,7 @@ Type: Array(UInt64).
|
||||
|
||||
Checks the ancestor of a key through the whole hierarchical chain in the dictionary.
|
||||
|
||||
```
|
||||
```sql
|
||||
dictIsIn('dict_name', child_id_expr, ancestor_id_expr)
|
||||
```
|
||||
|
||||
@ -169,7 +169,7 @@ All these functions have the `OrDefault` modification. For example, `dictGetDate
|
||||
|
||||
Syntax:
|
||||
|
||||
```
|
||||
```sql
|
||||
dictGet[Type]('dict_name', 'attr_name', id_expr)
|
||||
dictGet[Type]OrDefault('dict_name', 'attr_name', id_expr, default_value_expr)
|
||||
```
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Checks whether the argument is [NULL](../syntax.md#null).
|
||||
|
||||
```
|
||||
```sql
|
||||
isNull(x)
|
||||
```
|
||||
|
||||
@ -21,7 +21,7 @@ isNull(x)
|
||||
|
||||
Input table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 3 │
|
||||
@ -30,25 +30,21 @@ Input table
|
||||
|
||||
Query
|
||||
|
||||
```sql
|
||||
SELECT x FROM t_null WHERE isNull(y)
|
||||
```
|
||||
:) SELECT x FROM t_null WHERE isNull(y)
|
||||
|
||||
SELECT x
|
||||
FROM t_null
|
||||
WHERE isNull(y)
|
||||
|
||||
```text
|
||||
┌─x─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
|
||||
1 rows in set. Elapsed: 0.010 sec.
|
||||
```
|
||||
|
||||
## isNotNull
|
||||
|
||||
Checks whether the argument is [NULL](../syntax.md#null).
|
||||
|
||||
```
|
||||
```sql
|
||||
isNotNull(x)
|
||||
```
|
||||
|
||||
@ -65,7 +61,7 @@ isNotNull(x)
|
||||
|
||||
Input table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 3 │
|
||||
@ -74,25 +70,21 @@ Input table
|
||||
|
||||
Query
|
||||
|
||||
```sql
|
||||
SELECT x FROM t_null WHERE isNotNull(y)
|
||||
```
|
||||
:) SELECT x FROM t_null WHERE isNotNull(y)
|
||||
|
||||
SELECT x
|
||||
FROM t_null
|
||||
WHERE isNotNull(y)
|
||||
|
||||
```text
|
||||
┌─x─┐
|
||||
│ 2 │
|
||||
└───┘
|
||||
|
||||
1 rows in set. Elapsed: 0.010 sec.
|
||||
```
|
||||
|
||||
## coalesce
|
||||
|
||||
Checks from left to right whether `NULL` arguments were passed and returns the first non-`NULL` argument.
|
||||
|
||||
```
|
||||
```sql
|
||||
coalesce(x,...)
|
||||
```
|
||||
|
||||
@ -109,7 +101,7 @@ coalesce(x,...)
|
||||
|
||||
Consider a list of contacts that may specify multiple ways to contact a customer.
|
||||
|
||||
```
|
||||
```text
|
||||
┌─name─────┬─mail─┬─phone─────┬──icq─┐
|
||||
│ client 1 │ ᴺᵁᴸᴸ │ 123-45-67 │ 123 │
|
||||
│ client 2 │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
|
||||
@ -120,25 +112,22 @@ The `mail` and `phone` fields are of type String, but the `icq` field is `UInt32
|
||||
|
||||
Get the first available contact method for the customer from the contact list:
|
||||
|
||||
```sql
|
||||
SELECT coalesce(mail, phone, CAST(icq,'Nullable(String)')) FROM aBook
|
||||
```
|
||||
:) SELECT coalesce(mail, phone, CAST(icq,'Nullable(String)')) FROM aBook
|
||||
|
||||
SELECT coalesce(mail, phone, CAST(icq, 'Nullable(String)'))
|
||||
FROM aBook
|
||||
|
||||
```text
|
||||
┌─name─────┬─coalesce(mail, phone, CAST(icq, 'Nullable(String)'))─┐
|
||||
│ client 1 │ 123-45-67 │
|
||||
│ client 2 │ ᴺᵁᴸᴸ │
|
||||
└──────────┴──────────────────────────────────────────────────────┘
|
||||
|
||||
2 rows in set. Elapsed: 0.006 sec.
|
||||
```
|
||||
|
||||
## ifNull
|
||||
|
||||
Returns an alternative value if the main argument is `NULL`.
|
||||
|
||||
```
|
||||
```sql
|
||||
ifNull(x,alt)
|
||||
```
|
||||
|
||||
@ -154,17 +143,19 @@ ifNull(x,alt)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT ifNull('a', 'b')
|
||||
|
||||
```
|
||||
```text
|
||||
┌─ifNull('a', 'b')─┐
|
||||
│ a │
|
||||
└──────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT ifNull(NULL, 'b')
|
||||
|
||||
```
|
||||
```text
|
||||
┌─ifNull(NULL, 'b')─┐
|
||||
│ b │
|
||||
└───────────────────┘
|
||||
@ -174,7 +165,7 @@ SELECT ifNull(NULL, 'b')
|
||||
|
||||
Returns `NULL` if the arguments are equal.
|
||||
|
||||
```
|
||||
```sql
|
||||
nullIf(x, y)
|
||||
```
|
||||
|
||||
@ -189,17 +180,19 @@ nullIf(x, y)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT nullIf(1, 1)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─nullIf(1, 1)─┐
|
||||
│ ᴺᵁᴸᴸ │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT nullIf(1, 2)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─nullIf(1, 2)─┐
|
||||
│ 1 │
|
||||
└──────────────┘
|
||||
@ -209,7 +202,7 @@ SELECT nullIf(1, 2)
|
||||
|
||||
Results in a value of type [Nullable](../../data_types/nullable.md) for a non- `Nullable`, if the value is not `NULL`.
|
||||
|
||||
```
|
||||
```sql
|
||||
assumeNotNull(x)
|
||||
```
|
||||
|
||||
@ -226,15 +219,16 @@ assumeNotNull(x)
|
||||
|
||||
Consider the `t_null` table.
|
||||
|
||||
```
|
||||
```sql
|
||||
SHOW CREATE TABLE t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─statement─────────────────────────────────────────────────────────────────┐
|
||||
│ CREATE TABLE default.t_null ( x Int8, y Nullable(Int8)) ENGINE = TinyLog │
|
||||
└───────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 3 │
|
||||
@ -243,18 +237,20 @@ SHOW CREATE TABLE t_null
|
||||
|
||||
Apply the `assumeNotNull` function to the `y` column.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT assumeNotNull(y) FROM t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─assumeNotNull(y)─┐
|
||||
│ 0 │
|
||||
│ 3 │
|
||||
└──────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toTypeName(assumeNotNull(y)) FROM t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(assumeNotNull(y))─┐
|
||||
│ Int8 │
|
||||
│ Int8 │
|
||||
@ -265,7 +261,7 @@ SELECT toTypeName(assumeNotNull(y)) FROM t_null
|
||||
|
||||
Converts the argument type to `Nullable`.
|
||||
|
||||
```
|
||||
```sql
|
||||
toNullable(x)
|
||||
```
|
||||
|
||||
@ -279,15 +275,18 @@ toNullable(x)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toTypeName(10)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(10)─┐
|
||||
│ UInt8 │
|
||||
└────────────────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toTypeName(toNullable(10))
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(toNullable(10))─┐
|
||||
│ Nullable(UInt8) │
|
||||
└────────────────────────────┘
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
Calculate the distance between two points on the Earth's surface using [the great-circle formula](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
```
|
||||
```sql
|
||||
greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
@ -29,7 +29,7 @@ Generates an exception when the input parameter values fall outside of the range
|
||||
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
|
||||
│ 14132374.194975413 │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
@ -40,7 +40,7 @@ SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
Checks whether the point belongs to at least one of the ellipses.
|
||||
Coordinates are geometric in the Cartesian coordinate system.
|
||||
|
||||
```
|
||||
```sql
|
||||
pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)
|
||||
```
|
||||
|
||||
@ -62,7 +62,7 @@ The input parameters must be `2+4⋅n`, where `n` is the number of ellipses.
|
||||
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
@ -72,7 +72,7 @@ SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
|
||||
Checks whether the point belongs to the polygon on the plane.
|
||||
|
||||
```
|
||||
```sql
|
||||
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
|
||||
```
|
||||
|
||||
@ -93,7 +93,7 @@ If the point is on the polygon boundary, the function may return either 0 or 1.
|
||||
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
@ -102,7 +102,7 @@ SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
## geohashEncode
|
||||
|
||||
Encodes latitude and longitude as a geohash-string, please see (http://geohash.org/, https://en.wikipedia.org/wiki/Geohash).
|
||||
```
|
||||
```sql
|
||||
geohashEncode(longitude, latitude, [precision])
|
||||
```
|
||||
|
||||
@ -122,7 +122,7 @@ geohashEncode(longitude, latitude, [precision])
|
||||
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res──────────┐
|
||||
│ ezs42d000000 │
|
||||
└──────────────┘
|
||||
@ -146,7 +146,7 @@ Decodes any geohash-encoded string into longitude and latitude.
|
||||
SELECT geohashDecode('ezs42') AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────────────────────────┐
|
||||
│ (-5.60302734375,42.60498046875) │
|
||||
└─────────────────────────────────┘
|
||||
@ -156,7 +156,7 @@ SELECT geohashDecode('ezs42') AS res
|
||||
|
||||
Calculates [H3](https://uber.github.io/h3/#/documentation/overview/introduction) point index `(lon, lat)` with specified resolution.
|
||||
|
||||
```
|
||||
```sql
|
||||
geoToH3(lon, lat, resolution)
|
||||
```
|
||||
|
||||
@ -178,7 +178,7 @@ Type: [UInt64](../../data_types/int_uint.md).
|
||||
```sql
|
||||
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌────────────h3Index─┐
|
||||
│ 644325524701193974 │
|
||||
└────────────────────┘
|
||||
@ -207,10 +207,10 @@ Please note that function will throw an exception if resulting array is over 10'
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌─thasos──────────────────────────────────────┐
|
||||
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
@ -6,7 +6,7 @@ Hash functions can be used for the deterministic pseudo-random shuffling of elem
|
||||
|
||||
[Interprets](../../query_language/functions/type_conversion_functions.md#type_conversion_functions-reinterpretAsString) all the input parameters as strings and calculates the [MD5](https://en.wikipedia.org/wiki/MD5) hash value for each of them. Then combines hashes, takes the first 8 bytes of the hash of the resulting string, and interprets them as `UInt64` in big-endian byte order.
|
||||
|
||||
```
|
||||
```sql
|
||||
halfMD5(par1, ...)
|
||||
```
|
||||
|
||||
@ -42,7 +42,7 @@ If you want to get the same result as output by the md5sum utility, use lower(he
|
||||
|
||||
Produces a 64-bit [SipHash](https://131002.net/siphash/) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
sipHash64(par1,...)
|
||||
```
|
||||
|
||||
@ -68,7 +68,7 @@ A [UInt64](../../data_types/int_uint.md) data type hash value.
|
||||
```sql
|
||||
SELECT sipHash64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:00:00')) AS SipHash, toTypeName(SipHash) AS type
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────────SipHash─┬─type───┐
|
||||
│ 13726873534472839665 │ UInt64 │
|
||||
└──────────────────────┴────────┘
|
||||
@ -84,7 +84,7 @@ Differs from sipHash64 in that the final xor-folding state is only done up to 12
|
||||
|
||||
Produces a 64-bit [CityHash](https://github.com/google/cityhash) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
cityHash64(par1,...)
|
||||
```
|
||||
|
||||
@ -150,7 +150,7 @@ Levels are the same as in URLHierarchy. This function is specific to Yandex.Metr
|
||||
|
||||
Produces a 64-bit [FarmHash](https://github.com/google/farmhash) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
farmHash64(par1, ...)
|
||||
```
|
||||
|
||||
@ -191,7 +191,7 @@ This is just [JavaHash](#hash_functions-javahash) with zeroed out sign bit. This
|
||||
|
||||
Produces a 64-bit [MetroHash](http://www.jandrewrogers.com/2015/05/27/metrohash/) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
metroHash64(par1, ...)
|
||||
```
|
||||
|
||||
@ -224,7 +224,7 @@ For more information, see the link: [JumpConsistentHash](https://arxiv.org/pdf/1
|
||||
|
||||
Produces a [MurmurHash2](https://github.com/aappleby/smhasher) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
murmurHash2_32(par1, ...)
|
||||
murmurHash2_64(par1, ...)
|
||||
```
|
||||
@ -253,7 +253,7 @@ SELECT murmurHash2_64(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:
|
||||
|
||||
Produces a [MurmurHash3](https://github.com/aappleby/smhasher) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
murmurHash3_32(par1, ...)
|
||||
murmurHash3_64(par1, ...)
|
||||
```
|
||||
@ -282,7 +282,7 @@ SELECT murmurHash3_32(array('e','x','a'), 'mple', 10, toDateTime('2019-06-15 23:
|
||||
|
||||
Produces a 128-bit [MurmurHash3](https://github.com/aappleby/smhasher) hash value.
|
||||
|
||||
```
|
||||
```sql
|
||||
murmurHash3_128( expr )
|
||||
```
|
||||
|
||||
|
@ -27,7 +27,8 @@ Examples:
|
||||
|
||||
```sql
|
||||
SELECT arrayMap(x -> (x + 2), [1, 2, 3]) as res;
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────┐
|
||||
│ [3,4,5] │
|
||||
└─────────┘
|
||||
@ -36,7 +37,8 @@ The following example shows how to create a tuple of elements from different arr
|
||||
|
||||
```sql
|
||||
SELECT arrayMap((x, y) -> (x, y), [1, 2, 3], [4, 5, 6]) AS res
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────────────┐
|
||||
│ [(1,4),(2,5),(3,6)] │
|
||||
└─────────────────────┘
|
||||
@ -54,7 +56,7 @@ Examples:
|
||||
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res───────────┐
|
||||
│ ['abc World'] │
|
||||
└───────────────┘
|
||||
@ -69,7 +71,7 @@ SELECT
|
||||
AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─┐
|
||||
│ [2] │
|
||||
└─────┘
|
||||
@ -115,7 +117,7 @@ Example:
|
||||
SELECT arrayCumSum([1, 1, 1, 1]) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res──────────┐
|
||||
│ [1, 2, 3, 4] │
|
||||
└──────────────┘
|
||||
@ -129,7 +131,7 @@ Same as `arrayCumSum`, returns an array of partial sums of elements in the sourc
|
||||
SELECT arrayCumSumNonNegative([1, 1, -4, 1]) AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res───────┐
|
||||
│ [1,2,0,1] │
|
||||
└───────────┘
|
||||
@ -147,7 +149,7 @@ Example:
|
||||
SELECT arraySort((x, y) -> y, ['hello', 'world'], [2, 1]);
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res────────────────┐
|
||||
│ ['world', 'hello'] │
|
||||
└────────────────────┘
|
||||
@ -164,7 +166,7 @@ Example:
|
||||
```sql
|
||||
SELECT arrayReverseSort((x, y) -> y, ['hello', 'world'], [2, 1]) as res;
|
||||
```
|
||||
``` sql
|
||||
```text
|
||||
┌─res───────────────┐
|
||||
│ ['hello','world'] │
|
||||
└───────────────────┘
|
||||
|
@ -24,7 +24,7 @@ ORDER BY c DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─k──────────────┬─────c─┐
|
||||
│ 83.149.9.xxx │ 26238 │
|
||||
│ 217.118.81.xxx │ 26074 │
|
||||
@ -50,7 +50,7 @@ IPv6-mapped IPv4 addresses are output in the format ::ffff:111.222.33.44. Exampl
|
||||
SELECT IPv6NumToString(toFixedString(unhex('2A0206B8000000000000000000000011'), 16)) AS addr
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─addr─────────┐
|
||||
│ 2a02:6b8::11 │
|
||||
└──────────────┘
|
||||
@ -67,7 +67,7 @@ ORDER BY c DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─IPv6NumToString(ClientIP6)──────────────┬─────c─┐
|
||||
│ 2a02:2168:aaa:bbbb::2 │ 24695 │
|
||||
│ 2a02:2698:abcd:abcd:abcd:abcd:8888:5555 │ 22408 │
|
||||
@ -93,7 +93,7 @@ ORDER BY c DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─IPv6NumToString(ClientIP6)─┬──────c─┐
|
||||
│ ::ffff:94.26.111.111 │ 747440 │
|
||||
│ ::ffff:37.143.222.4 │ 529483 │
|
||||
@ -121,7 +121,7 @@ Takes a `UInt32` number. Interprets it as an IPv4 address in [big endian](https:
|
||||
SELECT IPv6NumToString(IPv4ToIPv6(IPv4StringToNum('192.168.0.1'))) AS addr
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─addr───────────────┐
|
||||
│ ::ffff:192.168.0.1 │
|
||||
└────────────────────┘
|
||||
@ -141,7 +141,7 @@ SELECT
|
||||
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─cutIPv6(ipv6, 2, 0)─────────────────┬─cutIPv6(ipv4, 0, 2)─┐
|
||||
│ 2001:db8:ac10:fe01:feed:babe:cafe:0 │ ::ffff:192.168.0.0 │
|
||||
└─────────────────────────────────────┴─────────────────────┘
|
||||
@ -155,7 +155,7 @@ Accepts an IPv4 and an UInt8 value containing the [CIDR](https://en.wikipedia.or
|
||||
```sql
|
||||
SELECT IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌─IPv4CIDRToRange(toIPv4('192.168.5.2'), 16)─┐
|
||||
│ ('192.168.0.0','192.168.255.255') │
|
||||
└────────────────────────────────────────────┘
|
||||
@ -171,7 +171,7 @@ Accepts an IPv6 and an UInt8 value containing the CIDR. Return a tuple with two
|
||||
SELECT IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32);
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─IPv6CIDRToRange(toIPv6('2001:0db8:0000:85a3:0000:0000:ac1f:8001'), 32)─┐
|
||||
│ ('2001:db8::','2001:db8:ffff:ffff:ffff:ffff:ffff:ffff') │
|
||||
└────────────────────────────────────────────────────────────────────────┘
|
||||
@ -189,7 +189,7 @@ SELECT
|
||||
toTypeName(toIPv4(IPv4_string))
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(IPv4StringToNum(IPv4_string))─┬─toTypeName(toIPv4(IPv4_string))─┐
|
||||
│ UInt32 │ IPv4 │
|
||||
└──────────────────────────────────────────┴─────────────────────────────────┘
|
||||
@ -203,7 +203,7 @@ SELECT
|
||||
hex(toIPv4(IPv4_string))
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─hex(IPv4StringToNum(IPv4_string))─┬─hex(toIPv4(IPv4_string))─┐
|
||||
│ ABE1822D │ ABE1822D │
|
||||
└───────────────────────────────────┴──────────────────────────┘
|
||||
@ -221,7 +221,7 @@ SELECT
|
||||
toTypeName(toIPv6(IPv6_string))
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(IPv6StringToNum(IPv6_string))─┬─toTypeName(toIPv6(IPv6_string))─┐
|
||||
│ FixedString(16) │ IPv6 │
|
||||
└──────────────────────────────────────────┴─────────────────────────────────┘
|
||||
@ -235,7 +235,7 @@ SELECT
|
||||
hex(toIPv6(IPv6_string))
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─hex(IPv6StringToNum(IPv6_string))─┬─hex(toIPv6(IPv6_string))─────────┐
|
||||
│ 20010438FFFF000000000000407D1BC1 │ 20010438FFFF000000000000407D1BC1 │
|
||||
└───────────────────────────────────┴──────────────────────────────────┘
|
||||
|
@ -35,7 +35,7 @@ Returns the value of a field, including separators.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
```sql
|
||||
visitParamExtractRaw('{"abc":"\\n\\u0000"}', 'abc') = '"\\n\\u0000"'
|
||||
visitParamExtractRaw('{"abc":{"def":[1,2,3]}}', 'abc') = '{"def":[1,2,3]}'
|
||||
```
|
||||
@ -46,7 +46,7 @@ Parses the string in double quotes. The value is unescaped. If unescaping failed
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
```sql
|
||||
visitParamExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
|
||||
visitParamExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
|
||||
visitParamExtractString('{"abc":"\\u263"}', 'abc') = ''
|
||||
@ -65,9 +65,9 @@ If the value does not exist, `0` will be returned.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
select JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1
|
||||
select JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0
|
||||
```sql
|
||||
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 1
|
||||
SELECT JSONHas('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 4) = 0
|
||||
```
|
||||
|
||||
`indices_or_keys` is a list of zero or more arguments each of them can be either string or integer.
|
||||
@ -82,12 +82,12 @@ You may use integers to access both JSON arrays and JSON objects.
|
||||
|
||||
So, for example:
|
||||
|
||||
```
|
||||
select JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a'
|
||||
select JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b'
|
||||
select JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b'
|
||||
select JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a'
|
||||
select JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello'
|
||||
```sql
|
||||
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'a'
|
||||
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', 2) = 'b'
|
||||
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -1) = 'b'
|
||||
SELECT JSONExtractKey('{"a": "hello", "b": [-100, 200.0, 300]}', -2) = 'a'
|
||||
SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 1) = 'hello'
|
||||
```
|
||||
|
||||
## JSONLength(json[, indices_or_keys]...)
|
||||
@ -98,9 +98,9 @@ If the value does not exist or has a wrong type, `0` will be returned.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
select JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3
|
||||
select JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2
|
||||
```sql
|
||||
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 3
|
||||
SELECT JSONLength('{"a": "hello", "b": [-100, 200.0, 300]}') = 2
|
||||
```
|
||||
|
||||
## JSONType(json[, indices_or_keys]...)
|
||||
@ -111,10 +111,10 @@ If the value does not exist, `Null` will be returned.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
select JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object'
|
||||
select JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String'
|
||||
select JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array'
|
||||
```sql
|
||||
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}') = 'Object'
|
||||
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'String'
|
||||
SELECT JSONType('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = 'Array'
|
||||
```
|
||||
|
||||
## JSONExtractUInt(json[, indices_or_keys]...)
|
||||
@ -128,10 +128,10 @@ If the value does not exist or has a wrong type, `0` will be returned.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
select JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) = -100
|
||||
select JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) = 200.0
|
||||
select JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) = 300
|
||||
```sql
|
||||
SELECT JSONExtractInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 1) = -100
|
||||
SELECT JSONExtractFloat('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 2) = 200.0
|
||||
SELECT JSONExtractUInt('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', -1) = 300
|
||||
```
|
||||
|
||||
## JSONExtractString(json[, indices_or_keys]...)
|
||||
@ -144,12 +144,12 @@ The value is unescaped. If unescaping failed, it returns an empty string.
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
select JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello'
|
||||
select JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
|
||||
select JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
|
||||
select JSONExtractString('{"abc":"\\u263"}', 'abc') = ''
|
||||
select JSONExtractString('{"abc":"hello}', 'abc') = ''
|
||||
```sql
|
||||
SELECT JSONExtractString('{"a": "hello", "b": [-100, 200.0, 300]}', 'a') = 'hello'
|
||||
SELECT JSONExtractString('{"abc":"\\n\\u0000"}', 'abc') = '\n\0'
|
||||
SELECT JSONExtractString('{"abc":"\\u263a"}', 'abc') = '☺'
|
||||
SELECT JSONExtractString('{"abc":"\\u263"}', 'abc') = ''
|
||||
SELECT JSONExtractString('{"abc":"hello}', 'abc') = ''
|
||||
```
|
||||
|
||||
## JSONExtract(json[, indices_or_keys...], return_type)
|
||||
@ -163,7 +163,7 @@ This means
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(String, Array(Float64))') = ('hello',[-100,200,300])
|
||||
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'Tuple(b Array(Float64), a String)') = ([-100,200,300],'hello')
|
||||
SELECT JSONExtract('{"a": "hello", "b": [-100, 200.0, 300]}', 'b', 'Array(Nullable(Int8))') = [-100, NULL, NULL]
|
||||
@ -179,7 +179,7 @@ Parse key-value pairs from a JSON where the values are of the given ClickHouse d
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT JSONExtractKeysAndValues('{"x": {"a": 5, "b": 7, "c": 11}}', 'x', 'Int8') = [('a',5),('b',7),('c',11)];
|
||||
```
|
||||
|
||||
@ -191,8 +191,8 @@ If the part does not exist or has a wrong type, an empty string will be returned
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
select JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'
|
||||
```sql
|
||||
SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300]}', 'b') = '[-100, 200.0, 300]'
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/query_language/functions/json_functions/) <!--hide-->
|
||||
|
@ -52,7 +52,7 @@ Example (three sigma rule):
|
||||
SELECT erf(3 / sqrt(2))
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─erf(divide(3, sqrt(2)))─┐
|
||||
│ 0.9973002039367398 │
|
||||
└─────────────────────────┘
|
||||
|
@ -8,7 +8,7 @@ Returns a string with the name of the host that this function was performed on.
|
||||
|
||||
Extracts the trailing part of a string after the last slash or backslash. This function if often used to extract the filename from a path.
|
||||
|
||||
```
|
||||
```sql
|
||||
basename( expr )
|
||||
```
|
||||
|
||||
@ -60,9 +60,10 @@ This function is used by the system for implementing Pretty formats.
|
||||
|
||||
`NULL` is represented as a string corresponding to `NULL` in `Pretty` formats.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT visibleWidth(NULL)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─visibleWidth(NULL)─┐
|
||||
│ 4 │
|
||||
└────────────────────┘
|
||||
@ -149,7 +150,7 @@ GROUP BY h
|
||||
ORDER BY h ASC
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──h─┬──────c─┬─bar────────────────┐
|
||||
│ 0 │ 292907 │ █████████▋ │
|
||||
│ 1 │ 180563 │ ██████ │
|
||||
@ -218,7 +219,7 @@ GROUP BY title
|
||||
ORDER BY c DESC
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─title─────┬──────c─┐
|
||||
│ Yandex │ 498635 │
|
||||
│ Google │ 229872 │
|
||||
@ -247,7 +248,7 @@ ORDER BY count() DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s──────────────┬───────c─┐
|
||||
│ │ 2906259 │
|
||||
│ www.yandex │ 867767 │
|
||||
@ -273,7 +274,7 @@ SELECT
|
||||
formatReadableSize(filesize_bytes) AS filesize
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─filesize_bytes─┬─filesize───┐
|
||||
│ 1 │ 1.00 B │
|
||||
│ 1024 │ 1.00 KiB │
|
||||
@ -335,7 +336,7 @@ SELECT
|
||||
FROM numbers(16)
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────month─┬─money─┬─prev_year─┬─year_over_year─┐
|
||||
│ 2018-01-01 │ 32 │ 0 │ 0 │
|
||||
│ 2018-02-01 │ 63 │ 0 │ 0 │
|
||||
@ -384,7 +385,7 @@ FROM
|
||||
)
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─EventID─┬───────────EventTime─┬─delta─┐
|
||||
│ 1106 │ 2016-11-24 00:00:04 │ 0 │
|
||||
│ 1107 │ 2016-11-24 00:00:05 │ 1 │
|
||||
@ -402,13 +403,16 @@ SELECT
|
||||
runningDifference(number + 1) AS diff
|
||||
FROM numbers(100000)
|
||||
WHERE diff != 1
|
||||
```
|
||||
```text
|
||||
┌─number─┬─diff─┐
|
||||
│ 0 │ 0 │
|
||||
└────────┴──────┘
|
||||
┌─number─┬─diff─┐
|
||||
│ 65536 │ 0 │
|
||||
└────────┴──────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
set max_block_size=100000 -- default value is 65536!
|
||||
|
||||
SELECT
|
||||
@ -416,6 +420,8 @@ SELECT
|
||||
runningDifference(number + 1) AS diff
|
||||
FROM numbers(100000)
|
||||
WHERE diff != 1
|
||||
```
|
||||
```text
|
||||
┌─number─┬─diff─┐
|
||||
│ 0 │ 0 │
|
||||
└────────┴──────┘
|
||||
@ -441,7 +447,7 @@ Accepts a MAC address in the format AA:BB:CC:DD:EE:FF (colon-separated numbers i
|
||||
|
||||
Returns the number of fields in [Enum](../../data_types/enum.md).
|
||||
|
||||
```
|
||||
```sql
|
||||
getSizeOfEnumType(value)
|
||||
```
|
||||
|
||||
@ -456,9 +462,10 @@ getSizeOfEnumType(value)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT getSizeOfEnumType( CAST('a' AS Enum8('a' = 1, 'b' = 2) ) ) AS x
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┐
|
||||
│ 2 │
|
||||
└───┘
|
||||
@ -468,7 +475,7 @@ SELECT getSizeOfEnumType( CAST('a' AS Enum8('a' = 1, 'b' = 2) ) ) AS x
|
||||
|
||||
Returns the name of the class that represents the data type of the column in RAM.
|
||||
|
||||
```
|
||||
```sql
|
||||
toColumnTypeName(value)
|
||||
```
|
||||
|
||||
@ -482,21 +489,18 @@ toColumnTypeName(value)
|
||||
|
||||
**Example of the difference between` toTypeName ' and ' toColumnTypeName`**
|
||||
|
||||
```sql
|
||||
SELECT toTypeName(CAST('2018-01-01 01:02:03' AS DateTime))
|
||||
```
|
||||
:) select toTypeName(cast('2018-01-01 01:02:03' AS DateTime))
|
||||
|
||||
SELECT toTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))
|
||||
|
||||
```text
|
||||
┌─toTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
|
||||
│ DateTime │
|
||||
└─────────────────────────────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.008 sec.
|
||||
|
||||
:) select toColumnTypeName(cast('2018-01-01 01:02:03' AS DateTime))
|
||||
|
||||
SELECT toColumnTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toColumnTypeName(CAST('2018-01-01 01:02:03' AS DateTime))
|
||||
```
|
||||
```text
|
||||
┌─toColumnTypeName(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
|
||||
│ Const(UInt32) │
|
||||
└───────────────────────────────────────────────────────────┘
|
||||
@ -508,7 +512,7 @@ The example shows that the `DateTime` data type is stored in memory as `Const(UI
|
||||
|
||||
Outputs a detailed description of data structures in RAM
|
||||
|
||||
```
|
||||
```sql
|
||||
dumpColumnStructure(value)
|
||||
```
|
||||
|
||||
@ -522,9 +526,10 @@ dumpColumnStructure(value)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))
|
||||
|
||||
```
|
||||
```text
|
||||
┌─dumpColumnStructure(CAST('2018-01-01 01:02:03', 'DateTime'))─┐
|
||||
│ DateTime, Const(size = 1, UInt32(size = 1)) │
|
||||
└──────────────────────────────────────────────────────────────┘
|
||||
@ -536,7 +541,7 @@ Outputs the default value for the data type.
|
||||
|
||||
Does not include default values for custom columns set by the user.
|
||||
|
||||
```
|
||||
```sql
|
||||
defaultValueOfArgumentType(expression)
|
||||
```
|
||||
|
||||
@ -552,26 +557,21 @@ defaultValueOfArgumentType(expression)
|
||||
|
||||
**Example**
|
||||
|
||||
```sql
|
||||
SELECT defaultValueOfArgumentType( CAST(1 AS Int8) )
|
||||
```
|
||||
:) SELECT defaultValueOfArgumentType( CAST(1 AS Int8) )
|
||||
|
||||
SELECT defaultValueOfArgumentType(CAST(1, 'Int8'))
|
||||
|
||||
```text
|
||||
┌─defaultValueOfArgumentType(CAST(1, 'Int8'))─┐
|
||||
│ 0 │
|
||||
└─────────────────────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
|
||||
:) SELECT defaultValueOfArgumentType( CAST(1 AS Nullable(Int8) ) )
|
||||
|
||||
SELECT defaultValueOfArgumentType(CAST(1, 'Nullable(Int8)'))
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT defaultValueOfArgumentType( CAST(1 AS Nullable(Int8) ) )
|
||||
```
|
||||
```text
|
||||
┌─defaultValueOfArgumentType(CAST(1, 'Nullable(Int8)'))─┐
|
||||
│ ᴺᵁᴸᴸ │
|
||||
└───────────────────────────────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
## indexHint
|
||||
@ -588,9 +588,10 @@ The expression passed to the function is not calculated, but ClickHouse applies
|
||||
|
||||
Here is a table with the test data for [ontime](../../getting_started/example_datasets/ontime.md).
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT count() FROM ontime
|
||||
|
||||
```
|
||||
```text
|
||||
┌─count()─┐
|
||||
│ 4276457 │
|
||||
└─────────┘
|
||||
@ -600,15 +601,10 @@ The table has indexes for the fields `(FlightDate, (Year, FlightDate))`.
|
||||
|
||||
Create a selection by date like this:
|
||||
|
||||
```sql
|
||||
SELECT FlightDate AS k, count() FROM ontime GROUP BY k ORDER BY k
|
||||
```
|
||||
:) SELECT FlightDate AS k, count() FROM ontime GROUP BY k ORDER BY k
|
||||
|
||||
SELECT
|
||||
FlightDate AS k,
|
||||
count()
|
||||
FROM ontime
|
||||
GROUP BY k
|
||||
ORDER BY k ASC
|
||||
```text
|
||||
|
||||
┌──────────k─┬─count()─┐
|
||||
│ 2017-01-01 │ 13970 │
|
||||
@ -618,37 +614,24 @@ ORDER BY k ASC
|
||||
│ 2017-09-29 │ 16384 │
|
||||
│ 2017-09-30 │ 12520 │
|
||||
└────────────┴─────────┘
|
||||
|
||||
273 rows in set. Elapsed: 0.072 sec. Processed 4.28 million rows, 8.55 MB (59.00 million rows/s., 118.01 MB/s.)
|
||||
```
|
||||
|
||||
In this selection, the index is not used and ClickHouse processed the entire table (`Processed 4.28 million rows`). To apply the index, select a specific date and run the following query:
|
||||
|
||||
```sql
|
||||
SELECT FlightDate AS k, count() FROM ontime WHERE k = '2017-09-15' GROUP BY k ORDER BY k
|
||||
```
|
||||
:) SELECT FlightDate AS k, count() FROM ontime WHERE k = '2017-09-15' GROUP BY k ORDER BY k
|
||||
|
||||
SELECT
|
||||
FlightDate AS k,
|
||||
count()
|
||||
FROM ontime
|
||||
WHERE k = '2017-09-15'
|
||||
GROUP BY k
|
||||
ORDER BY k ASC
|
||||
|
||||
```text
|
||||
┌──────────k─┬─count()─┐
|
||||
│ 2017-09-15 │ 16428 │
|
||||
└────────────┴─────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.014 sec. Processed 32.74 thousand rows, 65.49 KB (2.31 million rows/s., 4.63 MB/s.)
|
||||
```
|
||||
|
||||
The last line of output shows that by using the index, ClickHouse processed a significantly smaller number of rows (`Processed 32.74 thousand rows`).
|
||||
|
||||
Now pass the expression `k = '2017-09-15'` to the `indexHint` function:
|
||||
|
||||
```
|
||||
:) SELECT FlightDate AS k, count() FROM ontime WHERE indexHint(k = '2017-09-15') GROUP BY k ORDER BY k
|
||||
|
||||
```sql
|
||||
SELECT
|
||||
FlightDate AS k,
|
||||
count()
|
||||
@ -656,15 +639,14 @@ FROM ontime
|
||||
WHERE indexHint(k = '2017-09-15')
|
||||
GROUP BY k
|
||||
ORDER BY k ASC
|
||||
|
||||
```
|
||||
```text
|
||||
┌──────────k─┬─count()─┐
|
||||
│ 2017-09-14 │ 7071 │
|
||||
│ 2017-09-15 │ 16428 │
|
||||
│ 2017-09-16 │ 1077 │
|
||||
│ 2017-09-30 │ 8167 │
|
||||
└────────────┴─────────┘
|
||||
|
||||
4 rows in set. Elapsed: 0.004 sec. Processed 32.74 thousand rows, 65.49 KB (8.97 million rows/s., 17.94 MB/s.)
|
||||
```
|
||||
|
||||
The response to the request shows that ClickHouse applied the index in the same way as the previous time (`Processed 32.74 thousand rows`). However, the resulting set of rows shows that the expression `k = '2017-09-15'` was not used when generating the result.
|
||||
@ -677,7 +659,7 @@ Creates an array with a single value.
|
||||
|
||||
Used for internal implementation of [arrayJoin](array_join.md#functions_arrayjoin).
|
||||
|
||||
```
|
||||
```sql
|
||||
replicate(x, arr)
|
||||
```
|
||||
|
||||
@ -692,9 +674,10 @@ replicate(x, arr)
|
||||
|
||||
**Example**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT replicate(1, ['a', 'b', 'c'])
|
||||
|
||||
```
|
||||
```text
|
||||
┌─replicate(1, ['a', 'b', 'c'])─┐
|
||||
│ [1,1,1] │
|
||||
└───────────────────────────────┘
|
||||
@ -704,7 +687,7 @@ SELECT replicate(1, ['a', 'b', 'c'])
|
||||
|
||||
Returns the amount of remaining space in the filesystem where the files of the databases located. See the [path](../../operations/server_settings/settings.md#server_settings-path) server setting description.
|
||||
|
||||
```
|
||||
```sql
|
||||
filesystemAvailable()
|
||||
```
|
||||
|
||||
@ -756,7 +739,8 @@ custom_message - is an optional parameter: a constant string, provides an error
|
||||
|
||||
```sql
|
||||
SELECT throwIf(number = 3, 'Too many') FROM numbers(10);
|
||||
|
||||
```
|
||||
```text
|
||||
↙ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.) Received exception from server (version 19.14.1):
|
||||
Code: 395. DB::Exception: Received from localhost:9000. DB::Exception: Too many.
|
||||
```
|
||||
@ -767,7 +751,8 @@ Returns the same value that was used as its argument.
|
||||
|
||||
```sql
|
||||
SELECT identity(42)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─identity(42)─┐
|
||||
│ 42 │
|
||||
└──────────────┘
|
||||
|
@ -22,7 +22,7 @@ Rounds a value to a specified number of decimal places.
|
||||
|
||||
The function returns the nearest number of the specified order. In case when given number has equal distance to surrounding numbers the function returns the number having the nearest even digit (banker's rounding).
|
||||
|
||||
```
|
||||
```sql
|
||||
round(expression [, decimal_places])
|
||||
```
|
||||
|
||||
@ -45,7 +45,7 @@ The rounded number of the same type as the input number.
|
||||
```sql
|
||||
SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌───x─┬─round(divide(number, 2))─┐
|
||||
│ 0 │ 0 │
|
||||
│ 0.5 │ 0 │
|
||||
@ -57,7 +57,7 @@ SELECT number / 2 AS x, round(x) FROM system.numbers LIMIT 3
|
||||
|
||||
Rounding to the nearest number.
|
||||
|
||||
```
|
||||
```text
|
||||
round(3.2, 0) = 3
|
||||
round(4.1267, 2) = 4.13
|
||||
round(22,-1) = 20
|
||||
@ -67,7 +67,7 @@ round(-467,-2) = -500
|
||||
|
||||
Banker's rounding.
|
||||
|
||||
```
|
||||
```text
|
||||
round(3.5) = 4
|
||||
round(4.5) = 4
|
||||
round(3.55, 1) = 3.6
|
||||
|
@ -20,9 +20,10 @@ Selects substrings of consecutive bytes from the ranges a-z and A-Z.Returns an a
|
||||
|
||||
**Example:**
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT alphaTokens('abca1abc')
|
||||
|
||||
```
|
||||
```text
|
||||
┌─alphaTokens('abca1abc')─┐
|
||||
│ ['abca','abc'] │
|
||||
└─────────────────────────┘
|
||||
|
@ -64,7 +64,7 @@ Returns 1, if the set of bytes is valid UTF-8 encoded, otherwise 0.
|
||||
|
||||
Replaces invalid UTF-8 characters by the `<60>` (U+FFFD) character. All running in a row invalid characters are collapsed into the one replacement character.
|
||||
|
||||
```
|
||||
```sql
|
||||
toValidUTF8( input_string )
|
||||
```
|
||||
|
||||
@ -100,13 +100,16 @@ Formatting constant pattern with the string listed in the arguments. `pattern` i
|
||||
|
||||
```sql
|
||||
SELECT format('{1} {0} {1}', 'World', 'Hello')
|
||||
|
||||
```
|
||||
```text
|
||||
┌─format('{1} {0} {1}', 'World', 'Hello')─┐
|
||||
│ Hello World Hello │
|
||||
└─────────────────────────────────────────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT format('{} {}', 'Hello', 'World')
|
||||
|
||||
```
|
||||
```text
|
||||
┌─format('{} {}', 'Hello', 'World')─┐
|
||||
│ Hello World │
|
||||
└───────────────────────────────────┘
|
||||
|
@ -28,7 +28,7 @@ LIMIT 7
|
||||
FORMAT TabSeparated
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
2014-03-17 03/17/2014
|
||||
2014-03-18 03/18/2014
|
||||
2014-03-19 03/19/2014
|
||||
@ -44,7 +44,7 @@ Example 2. Copying a string ten times:
|
||||
SELECT replaceRegexpOne('Hello, World!', '.*', '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0') AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World!Hello, World! │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
@ -58,7 +58,7 @@ This does the same thing, but replaces all the occurrences. Example:
|
||||
SELECT replaceRegexpAll('Hello, World!', '.', '\\0\\0') AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res────────────────────────┐
|
||||
│ HHeelllloo,, WWoorrlldd!! │
|
||||
└────────────────────────────┘
|
||||
@ -71,7 +71,7 @@ Example:
|
||||
SELECT replaceRegexpAll('Hello, World!', '^', 'here: ') AS res
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─res─────────────────┐
|
||||
│ here: Hello, World! │
|
||||
└─────────────────────┘
|
||||
|
@ -194,7 +194,7 @@ When converting dates with times to numbers or vice versa, the date with time co
|
||||
|
||||
The date and date-with-time formats for the toDate/toDateTime functions are defined as follows:
|
||||
|
||||
```
|
||||
```text
|
||||
YYYY-MM-DD
|
||||
YYYY-MM-DD hh:mm:ss
|
||||
```
|
||||
@ -213,7 +213,7 @@ SELECT
|
||||
toString(now(), 'Asia/Yekaterinburg') AS now_yekat
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌───────────now_local─┬─now_yekat───────────┐
|
||||
│ 2016-06-15 00:11:21 │ 2016-06-15 02:11:21 │
|
||||
└─────────────────────┴─────────────────────┘
|
||||
@ -236,7 +236,7 @@ Example:
|
||||
SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────────────┬─s_cut─┐
|
||||
│ foo\0\0\0\0\0 │ foo │
|
||||
└───────────────┴───────┘
|
||||
@ -246,7 +246,7 @@ SELECT toFixedString('foo', 8) AS s, toStringCutToZero(s) AS s_cut
|
||||
SELECT toFixedString('foo\0bar', 8) AS s, toStringCutToZero(s) AS s_cut
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s──────────┬─s_cut─┐
|
||||
│ foo\0bar\0 │ foo │
|
||||
└────────────┴───────┘
|
||||
@ -287,7 +287,7 @@ SELECT
|
||||
CAST(timestamp, 'FixedString(22)') AS fixed_string
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─timestamp───────────┬────────────datetime─┬───────date─┬─string──────────────┬─fixed_string──────────────┐
|
||||
│ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 23:00:00 │ 2016-06-15 23:00:00\0\0\0 │
|
||||
└─────────────────────┴─────────────────────┴────────────┴─────────────────────┴───────────────────────────┘
|
||||
@ -297,16 +297,19 @@ Conversion to FixedString(N) only works for arguments of type String or FixedStr
|
||||
|
||||
Type conversion to [Nullable](../../data_types/nullable.md) and back is supported. Example:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toTypeName(x) FROM t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(x)─┐
|
||||
│ Int8 │
|
||||
│ Int8 │
|
||||
└───────────────┘
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toTypeName(CAST(x, 'Nullable(UInt16)')) FROM t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─toTypeName(CAST(x, 'Nullable(UInt16)'))─┐
|
||||
│ Nullable(UInt16) │
|
||||
│ Nullable(UInt16) │
|
||||
@ -328,7 +331,7 @@ SELECT
|
||||
date + interval_to_week
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─plus(date, interval_week)─┬─plus(date, interval_to_week)─┐
|
||||
│ 2019-01-08 │ 2019-01-08 │
|
||||
└───────────────────────────┴──────────────────────────────┘
|
||||
|
@ -16,7 +16,7 @@ Examples of typical returned values: http, https, ftp, mailto, tel, magnet...
|
||||
|
||||
Extracts the hostname from a URL.
|
||||
|
||||
```
|
||||
```sql
|
||||
domain(url)
|
||||
```
|
||||
|
||||
@ -27,7 +27,7 @@ domain(url)
|
||||
|
||||
The URL can be specified with or without a scheme. Examples:
|
||||
|
||||
```
|
||||
```text
|
||||
svn+ssh://some.svn-hosting.com:80/repo/trunk
|
||||
some.svn-hosting.com:80/repo/trunk
|
||||
https://yandex.com/time/
|
||||
@ -35,7 +35,7 @@ https://yandex.com/time/
|
||||
|
||||
For these examples, the `domain` function returns the following results:
|
||||
|
||||
```
|
||||
```text
|
||||
some.svn-hosting.com
|
||||
some.svn-hosting.com
|
||||
yandex.com
|
||||
@ -67,7 +67,7 @@ Returns the domain and removes no more than one 'www.' from the beginning of it,
|
||||
|
||||
Extracts the the top-level domain from a URL.
|
||||
|
||||
```
|
||||
```sql
|
||||
topLevelDomain(url)
|
||||
```
|
||||
|
||||
@ -77,7 +77,7 @@ topLevelDomain(url)
|
||||
|
||||
The URL can be specified with or without a scheme. Examples:
|
||||
|
||||
```
|
||||
```text
|
||||
svn+ssh://some.svn-hosting.com:80/repo/trunk
|
||||
some.svn-hosting.com:80/repo/trunk
|
||||
https://yandex.com/time/
|
||||
@ -151,7 +151,7 @@ Returns an array containing the URL, truncated at the end by the symbols /,? in
|
||||
|
||||
The same as above, but without the protocol and host in the result. The / element (root) is not included. Example: the function is used to implement tree reports the URL in Yandex. Metric.
|
||||
|
||||
```
|
||||
```text
|
||||
URLPathHierarchy('https://example.com/browse/CONV-6788') =
|
||||
[
|
||||
'/browse/',
|
||||
@ -168,7 +168,7 @@ Example:
|
||||
SELECT decodeURLComponent('http://127.0.0.1:8123/?query=SELECT%201%3B') AS DecodedURL;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─DecodedURL─────────────────────────────┐
|
||||
│ http://127.0.0.1:8123/?query=SELECT 1; │
|
||||
└────────────────────────────────────────┘
|
||||
|
@ -19,12 +19,13 @@ The UUID type value.
|
||||
This example demonstrates creating a table with the UUID type column and inserting a value into the table.
|
||||
|
||||
```sql
|
||||
:) CREATE TABLE t_uuid (x UUID) ENGINE=TinyLog
|
||||
CREATE TABLE t_uuid (x UUID) ENGINE=TinyLog
|
||||
|
||||
:) INSERT INTO t_uuid SELECT generateUUIDv4()
|
||||
|
||||
:) SELECT * FROM t_uuid
|
||||
INSERT INTO t_uuid SELECT generateUUIDv4()
|
||||
|
||||
SELECT * FROM t_uuid
|
||||
```
|
||||
```text
|
||||
┌────────────────────────────────────x─┐
|
||||
│ f4bf890f-f9dc-4332-ad5c-0c18e73f28e9 │
|
||||
└──────────────────────────────────────┘
|
||||
@ -45,8 +46,9 @@ The UUID type value.
|
||||
**Usage example**
|
||||
|
||||
```sql
|
||||
:) SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid
|
||||
|
||||
SELECT toUUID('61f0c404-5cb3-11e7-907b-a6006ad3dba0') AS uuid
|
||||
```
|
||||
```text
|
||||
┌─────────────────────────────────uuid─┐
|
||||
│ 61f0c404-5cb3-11e7-907b-a6006ad3dba0 │
|
||||
└──────────────────────────────────────┘
|
||||
@ -67,9 +69,11 @@ FixedString(16)
|
||||
**Usage examples**
|
||||
|
||||
```sql
|
||||
:) SELECT
|
||||
SELECT
|
||||
'612f3c40-5d3b-217e-707b-6a546a3d7b29' AS uuid,
|
||||
UUIDStringToNum(uuid) AS bytes
|
||||
```
|
||||
```text
|
||||
|
||||
┌─uuid─────────────────────────────────┬─bytes────────────┐
|
||||
│ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │ a/<@];!~p{jTj={) │
|
||||
@ -94,7 +98,8 @@ String.
|
||||
SELECT
|
||||
'a/<@];!~p{jTj={)' AS bytes,
|
||||
UUIDNumToString(toFixedString(bytes, 16)) AS uuid
|
||||
|
||||
```
|
||||
```text
|
||||
┌─bytes────────────┬─uuid─────────────────────────────────┐
|
||||
│ a/<@];!~p{jTj={) │ 612f3c40-5d3b-217e-707b-6a546a3d7b29 │
|
||||
└──────────────────┴──────────────────────────────────────┘
|
||||
|
@ -20,7 +20,7 @@ All the dictionaries are re-loaded in runtime (once every certain number of seco
|
||||
All functions for working with regions have an optional argument at the end – the dictionary key. It is referred to as the geobase.
|
||||
Example:
|
||||
|
||||
```
|
||||
```sql
|
||||
regionToCountry(RegionID) – Uses the default dictionary: /opt/geo/regions_hierarchy.txt
|
||||
regionToCountry(RegionID, '') – Uses the default dictionary: /opt/geo/regions_hierarchy.txt
|
||||
regionToCountry(RegionID, 'ua') – Uses the dictionary for the 'ua' key: /opt/geo/regions_hierarchy_ua.txt
|
||||
@ -40,7 +40,7 @@ FROM system.numbers
|
||||
LIMIT 15
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─regionToName(regionToArea(toUInt32(number), \'ua\'))─┐
|
||||
│ │
|
||||
│ Moscow and Moscow region │
|
||||
@ -70,7 +70,7 @@ FROM system.numbers
|
||||
LIMIT 15
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─regionToName(regionToDistrict(toUInt32(number), \'ua\'))─┐
|
||||
│ │
|
||||
│ Central federal district │
|
||||
|
@ -262,7 +262,7 @@ This query is nearly identical to: `SELECT * FROM system.processes`. The differe
|
||||
Tip (execute in the console):
|
||||
|
||||
```bash
|
||||
watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'"
|
||||
$ watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'"
|
||||
```
|
||||
|
||||
## SHOW TABLES
|
||||
|
@ -118,6 +118,8 @@ SELECT
|
||||
toMinute(OrderDate) AS OrderMinute,
|
||||
toSecond(OrderDate) AS OrderSecond
|
||||
FROM test.Orders;
|
||||
```
|
||||
```text
|
||||
|
||||
┌─OrderYear─┬─OrderMonth─┬─OrderDay─┬─OrderHour─┬─OrderMinute─┬─OrderSecond─┐
|
||||
│ 2008 │ 10 │ 11 │ 13 │ 23 │ 44 │
|
||||
@ -198,18 +200,13 @@ ClickHouse supports the `IS NULL` and `IS NOT NULL` operators.
|
||||
- `0` otherwise.
|
||||
- For other values, the `IS NULL` operator always returns `0`.
|
||||
|
||||
```bash
|
||||
:) SELECT x+100 FROM t_null WHERE y IS NULL
|
||||
|
||||
SELECT x + 100
|
||||
FROM t_null
|
||||
WHERE isNull(y)
|
||||
|
||||
```sql
|
||||
SELECT x+100 FROM t_null WHERE y IS NULL
|
||||
```
|
||||
```text
|
||||
┌─plus(x, 100)─┐
|
||||
│ 101 │
|
||||
└──────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
|
||||
@ -220,18 +217,13 @@ WHERE isNull(y)
|
||||
- `1` otherwise.
|
||||
- For other values, the `IS NOT NULL` operator always returns `1`.
|
||||
|
||||
```bash
|
||||
:) SELECT * FROM t_null WHERE y IS NOT NULL
|
||||
|
||||
SELECT *
|
||||
FROM t_null
|
||||
WHERE isNotNull(y)
|
||||
|
||||
```sql
|
||||
SELECT * FROM t_null WHERE y IS NOT NULL
|
||||
```
|
||||
```text
|
||||
┌─x─┬─y─┐
|
||||
│ 2 │ 3 │
|
||||
└───┴───┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/query_language/operators/) <!--hide-->
|
||||
|
@ -35,7 +35,7 @@ This section provides support for Common Table Expressions ([CTE](https://en.wik
|
||||
Results of WITH clause expressions can be used inside SELECT clause.
|
||||
|
||||
Example 1: Using constant expression as "variable"
|
||||
```
|
||||
```sql
|
||||
WITH '2019-08-01 15:23:00' as ts_upper_bound
|
||||
SELECT *
|
||||
FROM hits
|
||||
@ -45,7 +45,7 @@ WHERE
|
||||
```
|
||||
|
||||
Example 2: Evicting sum(bytes) expression result from SELECT clause column list
|
||||
```
|
||||
```sql
|
||||
WITH sum(bytes) as s
|
||||
SELECT
|
||||
formatReadableSize(s),
|
||||
@ -56,7 +56,7 @@ ORDER BY s
|
||||
```
|
||||
|
||||
Example 3: Using results of scalar subquery
|
||||
```
|
||||
```sql
|
||||
/* this example would return TOP 10 of most huge tables */
|
||||
WITH
|
||||
(
|
||||
@ -75,7 +75,7 @@ LIMIT 10
|
||||
|
||||
Example 4: Re-using expression in subquery
|
||||
As a workaround for current limitation for expression usage in subqueries, you may duplicate it.
|
||||
```
|
||||
```sql
|
||||
WITH ['hello'] AS hello
|
||||
SELECT
|
||||
hello,
|
||||
@ -85,7 +85,8 @@ FROM
|
||||
WITH ['hello'] AS hello
|
||||
SELECT hello
|
||||
)
|
||||
|
||||
```
|
||||
```text
|
||||
┌─hello─────┬─hello─────┐
|
||||
│ ['hello'] │ ['hello'] │
|
||||
└───────────┴───────────┘
|
||||
@ -256,7 +257,7 @@ CREATE TABLE arrays_test
|
||||
INSERT INTO arrays_test
|
||||
VALUES ('Hello', [1,2]), ('World', [3,4,5]), ('Goodbye', []);
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌─s───────────┬─arr─────┐
|
||||
│ Hello │ [1,2] │
|
||||
│ World │ [3,4,5] │
|
||||
@ -271,7 +272,7 @@ SELECT s, arr
|
||||
FROM arrays_test
|
||||
ARRAY JOIN arr;
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─arr─┐
|
||||
│ Hello │ 1 │
|
||||
│ Hello │ 2 │
|
||||
@ -288,7 +289,7 @@ SELECT s, arr
|
||||
FROM arrays_test
|
||||
LEFT ARRAY JOIN arr;
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌─s───────────┬─arr─┐
|
||||
│ Hello │ 1 │
|
||||
│ Hello │ 2 │
|
||||
@ -309,7 +310,7 @@ FROM arrays_test
|
||||
ARRAY JOIN arr AS a;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─arr─────┬─a─┐
|
||||
│ Hello │ [1,2] │ 1 │
|
||||
│ Hello │ [1,2] │ 2 │
|
||||
@ -327,7 +328,7 @@ FROM arrays_test
|
||||
ARRAY JOIN [1, 2, 3] AS arr_external;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s───────────┬─arr_external─┐
|
||||
│ Hello │ 1 │
|
||||
│ Hello │ 2 │
|
||||
@ -349,7 +350,7 @@ FROM arrays_test
|
||||
ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num, arrayMap(x -> x + 1, arr) AS mapped;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─arr─────┬─a─┬─num─┬─mapped─┐
|
||||
│ Hello │ [1,2] │ 1 │ 1 │ 2 │
|
||||
│ Hello │ [1,2] │ 2 │ 2 │ 3 │
|
||||
@ -367,7 +368,7 @@ FROM arrays_test
|
||||
ARRAY JOIN arr AS a, arrayEnumerate(arr) AS num;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─arr─────┬─a─┬─num─┬─arrayEnumerate(arr)─┐
|
||||
│ Hello │ [1,2] │ 1 │ 1 │ [1,2] │
|
||||
│ Hello │ [1,2] │ 2 │ 2 │ [1,2] │
|
||||
@ -394,7 +395,7 @@ INSERT INTO nested_test
|
||||
VALUES ('Hello', [1,2], [10,20]), ('World', [3,4,5], [30,40,50]), ('Goodbye', [], []);
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s───────┬─nest.x──┬─nest.y─────┐
|
||||
│ Hello │ [1,2] │ [10,20] │
|
||||
│ World │ [3,4,5] │ [30,40,50] │
|
||||
@ -408,7 +409,7 @@ FROM nested_test
|
||||
ARRAY JOIN nest;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─nest.x─┬─nest.y─┐
|
||||
│ Hello │ 1 │ 10 │
|
||||
│ Hello │ 2 │ 20 │
|
||||
@ -426,7 +427,7 @@ FROM nested_test
|
||||
ARRAY JOIN `nest.x`, `nest.y`;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─nest.x─┬─nest.y─┐
|
||||
│ Hello │ 1 │ 10 │
|
||||
│ Hello │ 2 │ 20 │
|
||||
@ -444,7 +445,7 @@ FROM nested_test
|
||||
ARRAY JOIN `nest.x`;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─nest.x─┬─nest.y─────┐
|
||||
│ Hello │ 1 │ [10,20] │
|
||||
│ Hello │ 2 │ [10,20] │
|
||||
@ -462,7 +463,7 @@ FROM nested_test
|
||||
ARRAY JOIN nest AS n;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┐
|
||||
│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │
|
||||
│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │
|
||||
@ -480,7 +481,7 @@ FROM nested_test
|
||||
ARRAY JOIN nest AS n, arrayEnumerate(`nest.x`) AS num;
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─s─────┬─n.x─┬─n.y─┬─nest.x──┬─nest.y─────┬─num─┐
|
||||
│ Hello │ 1 │ 10 │ [1,2] │ [10,20] │ 1 │
|
||||
│ Hello │ 2 │ 20 │ [1,2] │ [10,20] │ 2 │
|
||||
@ -524,13 +525,13 @@ If a query contains the `WHERE` clause, ClickHouse tries to pushdown filters fro
|
||||
|
||||
We recommend the `JOIN ON` or `JOIN USING` syntax for creating queries. For example:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM t1 JOIN t2 ON t1.a = t2.a JOIN t3 ON t1.a = t3.a
|
||||
```
|
||||
|
||||
You can use comma-separated lists of tables in the `FROM` clause. This works only with the [allow_experimental_cross_to_join_conversion = 1](../operations/settings/settings.md#settings-allow_experimental_cross_to_join_conversion) setting. For example:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT * FROM t1, t2, t3 WHERE t1.a = t2.a AND t1.a = t3.a
|
||||
```
|
||||
|
||||
@ -576,7 +577,7 @@ You can use the following types of syntax:
|
||||
|
||||
For example, consider the following tables:
|
||||
|
||||
```
|
||||
```text
|
||||
table_1 table_2
|
||||
|
||||
event | ev_time | user_id event | ev_time | user_id
|
||||
@ -634,7 +635,7 @@ ORDER BY hits DESC
|
||||
LIMIT 10
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─CounterID─┬───hits─┬─visits─┐
|
||||
│ 1143050 │ 523264 │ 13665 │
|
||||
│ 731962 │ 475698 │ 102716 │
|
||||
@ -761,7 +762,7 @@ Here's an example to show what this means.
|
||||
|
||||
Assume you have this table:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ 2 │
|
||||
│ 2 │ ᴺᵁᴸᴸ │
|
||||
@ -773,7 +774,7 @@ Assume you have this table:
|
||||
|
||||
The query `SELECT sum(x), y FROM t_null_big GROUP BY y` results in:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─sum(x)─┬────y─┐
|
||||
│ 4 │ 2 │
|
||||
│ 3 │ 3 │
|
||||
@ -918,7 +919,7 @@ Example:
|
||||
|
||||
For the table
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 2 │
|
||||
@ -935,7 +936,7 @@ For the table
|
||||
|
||||
Run the query `SELECT * FROM t_null_nan ORDER BY y NULLS FIRST` to get:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 7 │ ᴺᵁᴸᴸ │
|
||||
@ -1119,7 +1120,7 @@ GROUP BY EventDate
|
||||
ORDER BY EventDate ASC
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌──EventDate─┬────ratio─┐
|
||||
│ 2014-03-17 │ 1 │
|
||||
│ 2014-03-18 │ 0.807696 │
|
||||
@ -1140,7 +1141,7 @@ During request processing, the IN operator assumes that the result of an operati
|
||||
|
||||
Here is an example with the `t_null` table:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┬────y─┐
|
||||
│ 1 │ ᴺᵁᴸᴸ │
|
||||
│ 2 │ 3 │
|
||||
@ -1149,7 +1150,7 @@ Here is an example with the `t_null` table:
|
||||
|
||||
Running the query `SELECT x FROM t_null WHERE y IN (NULL,3)` gives you the following result:
|
||||
|
||||
```
|
||||
```text
|
||||
┌─x─┐
|
||||
│ 2 │
|
||||
└───┘
|
||||
@ -1157,10 +1158,11 @@ Running the query `SELECT x FROM t_null WHERE y IN (NULL,3)` gives you the follo
|
||||
|
||||
You can see that the row in which `y = NULL` is thrown out of the query results. This is because ClickHouse can't decide whether `NULL` is included in the `(NULL,3)` set, returns `0` as the result of the operation, and `SELECT` excludes this row from the final output.
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT y IN (NULL, 3)
|
||||
FROM t_null
|
||||
|
||||
```
|
||||
```text
|
||||
┌─in(y, tuple(NULL, 3))─┐
|
||||
│ 0 │
|
||||
│ 1 │
|
||||
|
@ -112,7 +112,7 @@ Data types and table engines in the `CREATE` query are written the same way as i
|
||||
|
||||
An alias is a user-defined name for an expression in a query.
|
||||
|
||||
```
|
||||
```sql
|
||||
expr AS alias
|
||||
```
|
||||
|
||||
@ -140,7 +140,7 @@ If an alias is defined for the result columns in the `SELECT` clause of a subque
|
||||
|
||||
Be careful with aliases that are the same as column or table names. Let's consider the following example:
|
||||
|
||||
```
|
||||
```sql
|
||||
CREATE TABLE t
|
||||
(
|
||||
a Int,
|
||||
@ -149,12 +149,13 @@ CREATE TABLE t
|
||||
ENGINE = TinyLog()
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT
|
||||
argMax(a, b),
|
||||
sum(b) AS b
|
||||
FROM t
|
||||
|
||||
```
|
||||
```text
|
||||
Received exception from server (version 18.14.17):
|
||||
Code: 184. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Aggregate function sum(b) is found inside another aggregate function in query.
|
||||
```
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
Creates a table from a file.
|
||||
|
||||
```
|
||||
```sql
|
||||
file(path, format, structure)
|
||||
```
|
||||
|
||||
@ -39,7 +39,7 @@ FROM file('test.csv', 'CSV', 'column1 UInt32, column2 UInt32, column3 UInt32')
|
||||
LIMIT 2
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─column1─┬─column2─┬─column3─┐
|
||||
│ 1 │ 2 │ 3 │
|
||||
│ 3 │ 2 │ 1 │
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
Creates a table from a file in HDFS.
|
||||
|
||||
```
|
||||
```sql
|
||||
hdfs(URI, format, structure)
|
||||
```
|
||||
|
||||
@ -27,7 +27,7 @@ FROM hdfs('hdfs://hdfs1:9000/test', 'TSV', 'column1 UInt32, column2 UInt32, colu
|
||||
LIMIT 2
|
||||
```
|
||||
|
||||
```
|
||||
```text
|
||||
┌─column1─┬─column2─┬─column3─┐
|
||||
│ 1 │ 2 │ 3 │
|
||||
│ 3 │ 2 │ 1 │
|
||||
|
@ -23,13 +23,13 @@ and data in `data.csv` has a different structure `(col1 String, col2 Date, col3
|
||||
data from the `data.csv` into the `test` table with simultaneous conversion looks like this:
|
||||
|
||||
```bash
|
||||
cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV";
|
||||
$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT lower(col1), col3 * col3 FROM input('col1 String, col2 Date, col3 Int32') FORMAT CSV";
|
||||
```
|
||||
|
||||
- If `data.csv` contains data of the same structure `test_structure` as the table `test` then these two queries are equal:
|
||||
```bash
|
||||
cat data.csv | clickhouse-client --query="INSERT INTO test FORMAT CSV"
|
||||
cat data.csv | clickhouse-client --query="INSERT INTO test SELECT * FROM input('test_structure') FORMAT CSV"
|
||||
$ cat data.csv | clickhouse-client --query="INSERT INTO test FORMAT CSV"
|
||||
$ cat data.csv | clickhouse-client --query="INSERT INTO test SELECT * FROM input('test_structure') FORMAT CSV"
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.yandex/docs/en/query_language/table_functions/input/) <!--hide-->
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Allows `SELECT` queries to be performed on data that is stored on a remote MySQL server.
|
||||
|
||||
```
|
||||
```sql
|
||||
mysql('host:port', 'database', 'table', 'user', 'password'[, replace_query, 'on_duplicate_clause']);
|
||||
```
|
||||
|
||||
@ -32,7 +32,7 @@ A table object with the same columns as the original MySQL table.
|
||||
|
||||
Table in MySQL:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
Returns table that is connected via [ODBC](https://en.wikipedia.org/wiki/Open_Database_Connectivity).
|
||||
|
||||
```
|
||||
```sql
|
||||
odbc(connection_settings, external_database, external_table)
|
||||
```
|
||||
|
||||
@ -26,15 +26,17 @@ Ensure that unixODBC and MySQL Connector are installed.
|
||||
|
||||
By default (if installed from packages), ClickHouse starts as user `clickhouse`. Thus you need to create and configure this user in the MySQL server.
|
||||
|
||||
```bash
|
||||
$ sudo mysql
|
||||
```
|
||||
sudo mysql
|
||||
```sql
|
||||
mysql> CREATE USER 'clickhouse'@'localhost' IDENTIFIED BY 'clickhouse';
|
||||
mysql> GRANT ALL PRIVILEGES ON *.* TO 'clickhouse'@'clickhouse' WITH GRANT OPTION;
|
||||
```
|
||||
|
||||
Then configure the connection in `/etc/odbc.ini`.
|
||||
|
||||
```
|
||||
```bash
|
||||
$ cat /etc/odbc.ini
|
||||
[mysqlconn]
|
||||
DRIVER = /usr/local/lib/libmyodbc5w.so
|
||||
@ -47,8 +49,8 @@ PASSWORD = clickhouse
|
||||
|
||||
You can check the connection using the `isql` utility from the unixODBC installation.
|
||||
|
||||
```
|
||||
isql -v mysqlconn
|
||||
```bash
|
||||
$ isql -v mysqlconn
|
||||
+---------------------------------------+
|
||||
| Connected! |
|
||||
| |
|
||||
@ -57,7 +59,7 @@ isql -v mysqlconn
|
||||
|
||||
Table in MySQL:
|
||||
|
||||
```
|
||||
```text
|
||||
mysql> CREATE TABLE `test`.`test` (
|
||||
-> `int_id` INT NOT NULL AUTO_INCREMENT,
|
||||
-> `int_nullable` INT NULL DEFAULT NULL,
|
||||
|
@ -17,7 +17,7 @@ remote('addresses_expr', db.table[, 'user'[, 'password']])
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
```text
|
||||
example01-01-1
|
||||
example01-01-1:9000
|
||||
localhost
|
||||
@ -30,19 +30,19 @@ Multiple addresses can be comma-separated. In this case, ClickHouse will use dis
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
```text
|
||||
example01-01-1,example01-02-1
|
||||
```
|
||||
|
||||
Part of the expression can be specified in curly brackets. The previous example can be written as follows:
|
||||
|
||||
```
|
||||
```text
|
||||
example01-0{1,2}-1
|
||||
```
|
||||
|
||||
Curly brackets can contain a range of numbers separated by two dots (non-negative integers). In this case, the range is expanded to a set of values that generate shard addresses. If the first number starts with zero, the values are formed with the same zero alignment. The previous example can be written as follows:
|
||||
|
||||
```
|
||||
```text
|
||||
example01-{01..02}-1
|
||||
```
|
||||
|
||||
@ -52,7 +52,7 @@ Addresses and parts of addresses in curly brackets can be separated by the pipe
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
```text
|
||||
example01-{01..02}-{1|2}
|
||||
```
|
||||
|
||||
|
@ -8,41 +8,32 @@
|
||||
|
||||
Массив можно создать с помощью функции:
|
||||
|
||||
```
|
||||
```sql
|
||||
array(T)
|
||||
```
|
||||
|
||||
Также можно использовать квадратные скобки
|
||||
|
||||
```
|
||||
```sql
|
||||
[]
|
||||
```
|
||||
|
||||
Пример создания массива:
|
||||
```sql
|
||||
SELECT array(1, 2) AS x, toTypeName(x)
|
||||
```
|
||||
:) SELECT array(1, 2) AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```text
|
||||
┌─x─────┬─toTypeName(array(1, 2))─┐
|
||||
│ [1,2] │ Array(UInt8) │
|
||||
└───────┴─────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
|
||||
:) SELECT [1, 2] AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT [1, 2] AS x, toTypeName(x)
|
||||
```
|
||||
```text
|
||||
┌─x─────┬─toTypeName([1, 2])─┐
|
||||
│ [1,2] │ Array(UInt8) │
|
||||
└───────┴────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
## Особенности работы с типами данных
|
||||
@ -53,31 +44,23 @@ SELECT
|
||||
|
||||
Примеры автоматического определения типа данных:
|
||||
|
||||
```sql
|
||||
SELECT array(1, 2, NULL) AS x, toTypeName(x)
|
||||
```
|
||||
:) SELECT array(1, 2, NULL) AS x, toTypeName(x)
|
||||
|
||||
SELECT
|
||||
[1, 2, NULL] AS x,
|
||||
toTypeName(x)
|
||||
|
||||
```text
|
||||
┌─x──────────┬─toTypeName(array(1, 2, NULL))─┐
|
||||
│ [1,2,NULL] │ Array(Nullable(UInt8)) │
|
||||
└────────────┴───────────────────────────────┘
|
||||
|
||||
1 rows in set. Elapsed: 0.002 sec.
|
||||
```
|
||||
|
||||
Если попытаться создать массив из несовместимых типов данных, то ClickHouse выбросит исключение:
|
||||
|
||||
```sql
|
||||
SELECT array(1, 'a')
|
||||
```
|
||||
:) SELECT array(1, 'a')
|
||||
|
||||
SELECT [1, 'a']
|
||||
|
||||
```text
|
||||
Received exception from server (version 1.1.54388):
|
||||
Code: 386. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: There is no supertype for types UInt8, String because some of them are String/FixedString and some of them are not.
|
||||
|
||||
0 rows in set. Elapsed: 0.246 sec.
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.yandex/docs/ru/data_types/array/) <!--hide-->
|
||||
|
@ -50,35 +50,35 @@
|
||||
## Проверка переполнений
|
||||
|
||||
При выполнении операций над типом Decimal могут происходить целочисленные переполнения. Лишняя дробная часть отбрасывается (не округляется). Лишняя целочисленная часть приводит к исключению.
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(2, 4) AS x, x / 3
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────x─┬─divide(toDecimal32(2, 4), 3)─┐
|
||||
│ 2.0000 │ 0.6666 │
|
||||
└────────┴──────────────────────────────┘
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(4.2, 8) AS x, x * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Scale is out of bounds.
|
||||
```
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Decimal math overflow.
|
||||
```
|
||||
|
||||
Проверка переполнения приводит к замедлению операций. При уверенности, что типа результата хватит для его записи проверку переполнения можно отключить настройкой decimal_check_overflow. В этом случае при переполнении вернется неверное значение:
|
||||
```
|
||||
```sql
|
||||
SET decimal_check_overflow = 0;
|
||||
SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
```
|
||||
```
|
||||
```text
|
||||
┌──────────x─┬─multiply(6, toDecimal32(4.2, 8))─┐
|
||||
│ 4.20000000 │ -17.74967296 │
|
||||
└────────────┴──────────────────────────────────┘
|
||||
@ -86,10 +86,10 @@ SELECT toDecimal32(4.2, 8) AS x, 6 * x
|
||||
|
||||
Переполнения происходят не только на арифметических операциях, но и на операциях сравнения. Отключать проверку стоит только при полной уверенности в корректности результата:
|
||||
|
||||
```
|
||||
```sql
|
||||
SELECT toDecimal32(1, 8) < 100
|
||||
```
|
||||
```
|
||||
```text
|
||||
DB::Exception: Can't compare.
|
||||
```
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user