mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 09:32:01 +00:00
Merge remote-tracking branch 'origin/master' into rework-integrational
This commit is contained in:
commit
c34b1b7db8
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -174,3 +174,9 @@
|
||||
[submodule "contrib/sentry-native"]
|
||||
path = contrib/sentry-native
|
||||
url = https://github.com/getsentry/sentry-native.git
|
||||
[submodule "contrib/gcem"]
|
||||
path = contrib/gcem
|
||||
url = https://github.com/kthohr/gcem.git
|
||||
[submodule "contrib/stats"]
|
||||
path = contrib/stats
|
||||
url = https://github.com/kthohr/stats.git
|
||||
|
@ -49,7 +49,7 @@ public:
|
||||
struct Values
|
||||
{
|
||||
/// Least significat 32 bits from time_t at beginning of the day.
|
||||
/// If the unix timestamp of beginning of the day is negative (example: 1970-01-01 MSK, where time_t == -10800), then value is zero.
|
||||
/// If the unix timestamp of beginning of the day is negative (example: 1970-01-01 MSK, where time_t == -10800), then value will overflow.
|
||||
/// Change to time_t; change constants above; and recompile the sources if you need to support time after 2105 year.
|
||||
UInt32 date;
|
||||
|
||||
|
2
contrib/CMakeLists.txt
vendored
2
contrib/CMakeLists.txt
vendored
@ -306,4 +306,6 @@ if (USE_SENTRY)
|
||||
endif()
|
||||
|
||||
add_subdirectory (fmtlib-cmake)
|
||||
add_subdirectory (stats-cmake)
|
||||
add_subdirectory (gcem)
|
||||
|
||||
|
1
contrib/gcem
vendored
Submodule
1
contrib/gcem
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 8d4f1b5d76ea8f6ff12f3f4f34cda45424556b00
|
1
contrib/stats
vendored
Submodule
1
contrib/stats
vendored
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit b6dd459c10a88c7ea04693c007e9e35820c5d9ad
|
10
contrib/stats-cmake/CMakeLists.txt
Normal file
10
contrib/stats-cmake/CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
||||
# The stats is a header-only library of probability density functions,
|
||||
# cumulative distribution functions, quantile functions, and random sampling methods.
|
||||
|
||||
set(STATS_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/stats/include)
|
||||
set(GCEM_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/gcem/include)
|
||||
|
||||
add_library(stats INTERFACE)
|
||||
|
||||
target_include_directories(stats SYSTEM INTERFACE ${STATS_INCLUDE_DIR})
|
||||
target_include_directories(stats SYSTEM INTERFACE ${GCEM_INCLUDE_DIR})
|
@ -1535,7 +1535,7 @@ Default value: 16.
|
||||
|
||||
## validate\_polygons {#validate_polygons}
|
||||
|
||||
Enables or disables throwing an exception in the [pointInPolygon](../../sql-reference/functions/geo.md#pointinpolygon) function, if the polygon is self-intersecting or self-tangent.
|
||||
Enables or disables throwing an exception in the [pointInPolygon](../../sql-reference/functions/geo/index.md#pointinpolygon) function, if the polygon is self-intersecting or self-tangent.
|
||||
|
||||
Possible values:
|
||||
|
||||
|
@ -15,6 +15,9 @@ The following aggregate functions are supported:
|
||||
- [`groupBitXor`](../../sql-reference/aggregate-functions/reference/groupbitxor.md#groupbitxor)
|
||||
- [`groupArrayArray`](../../sql-reference/aggregate-functions/reference/grouparray.md#agg_function-grouparray)
|
||||
- [`groupUniqArrayArray`](../../sql-reference/aggregate-functions/reference/groupuniqarray.md)
|
||||
- [`sumMap`](../../sql-reference/aggregate-functions/reference/summap.md#agg_functions-summap)
|
||||
- [`minMap`](../../sql-reference/aggregate-functions/reference/minmap.md#agg_functions-minmap)
|
||||
- [`maxMap`](../../sql-reference/aggregate-functions/reference/maxmap.md#agg_functions-maxmap)
|
||||
|
||||
Values of the `SimpleAggregateFunction(func, Type)` look and stored the same way as `Type`, so you do not need to apply functions with `-Merge`/`-State` suffixes. `SimpleAggregateFunction` has better performance than `AggregateFunction` with same aggregation function.
|
||||
|
||||
|
@ -1,554 +0,0 @@
|
||||
---
|
||||
toc_priority: 62
|
||||
toc_title: Geographical Coordinates
|
||||
---
|
||||
|
||||
# Functions for Working with Geographical Coordinates {#functions-for-working-with-geographical-coordinates}
|
||||
|
||||
## greatCircleDistance {#greatcircledistance}
|
||||
|
||||
Calculates 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)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`.
|
||||
- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`.
|
||||
- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`.
|
||||
- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`.
|
||||
|
||||
Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude.
|
||||
|
||||
**Returned value**
|
||||
|
||||
The distance between two points on the Earth’s surface, in meters.
|
||||
|
||||
Generates an exception when the input parameter values fall outside of the range.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
|
||||
│ 14132374.194975413 │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## greatCircleAngle {#greatcircleangle}
|
||||
|
||||
Calculates the central angle between two points on the Earth’s surface using [the great-circle formula](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `lon1Deg` — Longitude of the first point in degrees.
|
||||
- `lat1Deg` — Latitude of the first point in degrees.
|
||||
- `lon2Deg` — Longitude of the second point in degrees.
|
||||
- `lat2Deg` — Latitude of the second point in degrees.
|
||||
|
||||
**Returned value**
|
||||
|
||||
The central angle between two points in degrees.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─arc─┐
|
||||
│ 45 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## pointInEllipses {#pointinellipses}
|
||||
|
||||
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ₙ)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `x, y` — Coordinates of a point on the plane.
|
||||
- `xᵢ, yᵢ` — Coordinates of the center of the `i`-th ellipsis.
|
||||
- `aᵢ, bᵢ` — Axes of the `i`-th ellipsis in units of x, y coordinates.
|
||||
|
||||
The input parameters must be `2+4⋅n`, where `n` is the number of ellipses.
|
||||
|
||||
**Returned values**
|
||||
|
||||
`1` if the point is inside at least one of the ellipses; `0`if it is not.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## pointInPolygon {#pointinpolygon}
|
||||
|
||||
Checks whether the point belongs to the polygon on the plane.
|
||||
|
||||
``` sql
|
||||
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
|
||||
```
|
||||
|
||||
**Input values**
|
||||
|
||||
- `(x, y)` — Coordinates of a point on the plane. Data type — [Tuple](../../sql-reference/data-types/tuple.md) — A tuple of two numbers.
|
||||
- `[(a, b), (c, d) ...]` — Polygon vertices. Data type — [Array](../../sql-reference/data-types/array.md). Each vertex is represented by a pair of coordinates `(a, b)`. Vertices should be specified in a clockwise or counterclockwise order. The minimum number of vertices is 3. The polygon must be constant.
|
||||
- The function also supports polygons with holes (cut out sections). In this case, add polygons that define the cut out sections using additional arguments of the function. The function does not support non-simply-connected polygons.
|
||||
|
||||
**Returned values**
|
||||
|
||||
`1` if the point is inside the polygon, `0` if it is not.
|
||||
If the point is on the polygon boundary, the function may return either 0 or 1.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## geohashEncode {#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])
|
||||
```
|
||||
|
||||
**Input values**
|
||||
|
||||
- longitude - longitude part of the coordinate you want to encode. Floating in range`[-180°, 180°]`
|
||||
- latitude - latitude part of the coordinate you want to encode. Floating in range `[-90°, 90°]`
|
||||
- precision - Optional, length of the resulting encoded string, defaults to `12`. Integer in range `[1, 12]`. Any value less than `1` or greater than `12` is silently converted to `12`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- alphanumeric `String` of encoded coordinate (modified version of the base32-encoding alphabet is used).
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res──────────┐
|
||||
│ ezs42d000000 │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## geohashDecode {#geohashdecode}
|
||||
|
||||
Decodes any geohash-encoded string into longitude and latitude.
|
||||
|
||||
**Input values**
|
||||
|
||||
- encoded string - geohash-encoded string.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- (longitude, latitude) - 2-tuple of `Float64` values of longitude and latitude.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT geohashDecode('ezs42') AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─────────────────────────────┐
|
||||
│ (-5.60302734375,42.60498046875) │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## geoToH3 {#geotoh3}
|
||||
|
||||
Returns [H3](https://uber.github.io/h3/#/documentation/overview/introduction) point index `(lon, lat)` with specified resolution.
|
||||
|
||||
[H3](https://uber.github.io/h3/#/documentation/overview/introduction) is a geographical indexing system where Earth’s surface divided into even hexagonal tiles. This system is hierarchical, i. e. each hexagon on the top level can be splitted into seven even but smaller ones and so on.
|
||||
|
||||
This index is used primarily for bucketing locations and other geospatial manipulations.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
geoToH3(lon, lat, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `lon` — Longitude. Type: [Float64](../../sql-reference/data-types/float.md).
|
||||
- `lat` — Latitude. Type: [Float64](../../sql-reference/data-types/float.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Hexagon index number.
|
||||
- 0 in case of error.
|
||||
|
||||
Type: `UInt64`.
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌────────────h3Index─┐
|
||||
│ 644325524701193974 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## geohashesInBox {#geohashesinbox}
|
||||
|
||||
Returns an array of geohash-encoded strings of given precision that fall inside and intersect boundaries of given box, basically a 2D grid flattened into array.
|
||||
|
||||
**Input values**
|
||||
|
||||
- longitude\_min - min longitude, floating value in range `[-180°, 180°]`
|
||||
- latitude\_min - min latitude, floating value in range `[-90°, 90°]`
|
||||
- longitude\_max - max longitude, floating value in range `[-180°, 180°]`
|
||||
- latitude\_max - max latitude, floating value in range `[-90°, 90°]`
|
||||
- precision - geohash precision, `UInt8` in range `[1, 12]`
|
||||
|
||||
Please note that all coordinate parameters should be of the same type: either `Float32` or `Float64`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- array of precision-long strings of geohash-boxes covering provided area, you should not rely on order of items.
|
||||
- \[\] - empty array if *min* values of *latitude* and *longitude* aren’t less than corresponding *max* values.
|
||||
|
||||
Please note that function will throw an exception if resulting array is over 10’000’000 items long.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─thasos──────────────────────────────────────┐
|
||||
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetBaseCell {#h3getbasecell}
|
||||
|
||||
Returns the base cell number of the H3 index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3GetBaseCell(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Hexagon base cell number.
|
||||
|
||||
Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetBaseCell(612916788725809151) as basecell;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─basecell─┐
|
||||
│ 12 │
|
||||
└──────────┘
|
||||
```
|
||||
|
||||
## h3HexAreaM2 {#h3hexaream2}
|
||||
|
||||
Returns average hexagon area in square meters at the given resolution.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3HexAreaM2(resolution)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Area in square meters.
|
||||
|
||||
Type: [Float64](../../sql-reference/data-types/float.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3HexAreaM2(13) as area;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─area─┐
|
||||
│ 43.9 │
|
||||
└──────┘
|
||||
```
|
||||
|
||||
## h3IndexesAreNeighbors {#h3indexesareneighbors}
|
||||
|
||||
Returns whether or not the provided H3 indexes are neighbors.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3IndexesAreNeighbors(index1, index2)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index1` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `index2` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- `1` — Indexes are neighbours.
|
||||
- `0` — Indexes are not neighbours.
|
||||
|
||||
Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─n─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
## h3ToChildren {#h3tochildren}
|
||||
|
||||
Returns an array of child indexes for the given H3 index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3ToChildren(index, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Array of the child H3-indexes.
|
||||
|
||||
Type: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToChildren(599405990164561919, 6) AS children;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToParent {#h3toparent}
|
||||
|
||||
Returns the parent (coarser) index containing the given H3 index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3ToParent(index, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Parent H3 index.
|
||||
|
||||
Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToParent(599405990164561919, 3) as parent;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─────────────parent─┐
|
||||
│ 590398848891879423 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToString {#h3tostring}
|
||||
|
||||
Converts the `H3Index` representation of the index to the string representation.
|
||||
|
||||
``` sql
|
||||
h3ToString(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- String representation of the H3 index.
|
||||
|
||||
Type: [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToString(617420388352917503) as h3_string;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─h3_string───────┐
|
||||
│ 89184926cdbffff │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## stringToH3 {#stringtoh3}
|
||||
|
||||
Converts the string representation to the `H3Index` (UInt64) representation.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
stringToH3(index_str)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index_str` — String representation of the H3 index. Type: [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Hexagon index number. Returns 0 on error. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT stringToH3('89184926cc3ffff') as index;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌──────────────index─┐
|
||||
│ 617420388351344639 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Returns the resolution of the H3 index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Index resolution. Range: `[0, 15]`. Type: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(617420388352917503) as res;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 9 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/functions/geo/) <!--hide-->
|
140
docs/en/sql-reference/functions/geo/coordinates.md
Normal file
140
docs/en/sql-reference/functions/geo/coordinates.md
Normal file
@ -0,0 +1,140 @@
|
||||
---
|
||||
toc_title: Geographical Coordinates
|
||||
toc_priority: 62
|
||||
---
|
||||
|
||||
|
||||
# Functions for Working with Geographical Coordinates {#geographical-coordinates}
|
||||
|
||||
## greatCircleDistance {#greatcircledistance}
|
||||
|
||||
Calculates 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)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `lon1Deg` — Longitude of the first point in degrees. Range: `[-180°, 180°]`.
|
||||
- `lat1Deg` — Latitude of the first point in degrees. Range: `[-90°, 90°]`.
|
||||
- `lon2Deg` — Longitude of the second point in degrees. Range: `[-180°, 180°]`.
|
||||
- `lat2Deg` — Latitude of the second point in degrees. Range: `[-90°, 90°]`.
|
||||
|
||||
Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude.
|
||||
|
||||
**Returned value**
|
||||
|
||||
The distance between two points on the Earth’s surface, in meters.
|
||||
|
||||
Generates an exception when the input parameter values fall outside of the range.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
|
||||
│ 14132374.194975413 │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## greatCircleAngle {#greatcircleangle}
|
||||
|
||||
Calculates the central angle between two points on the Earth’s surface using [the great-circle formula](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `lon1Deg` — Longitude of the first point in degrees.
|
||||
- `lat1Deg` — Latitude of the first point in degrees.
|
||||
- `lon2Deg` — Longitude of the second point in degrees.
|
||||
- `lat2Deg` — Latitude of the second point in degrees.
|
||||
|
||||
**Returned value**
|
||||
|
||||
The central angle between two points in degrees.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─arc─┐
|
||||
│ 45 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## pointInEllipses {#pointinellipses}
|
||||
|
||||
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ₙ)
|
||||
```
|
||||
|
||||
**Input parameters**
|
||||
|
||||
- `x, y` — Coordinates of a point on the plane.
|
||||
- `xᵢ, yᵢ` — Coordinates of the center of the `i`-th ellipsis.
|
||||
- `aᵢ, bᵢ` — Axes of the `i`-th ellipsis in units of x, y coordinates.
|
||||
|
||||
The input parameters must be `2+4⋅n`, where `n` is the number of ellipses.
|
||||
|
||||
**Returned values**
|
||||
|
||||
`1` if the point is inside at least one of the ellipses; `0`if it is not.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## pointInPolygon {#pointinpolygon}
|
||||
|
||||
Checks whether the point belongs to the polygon on the plane.
|
||||
|
||||
``` sql
|
||||
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
|
||||
```
|
||||
|
||||
**Input values**
|
||||
|
||||
- `(x, y)` — Coordinates of a point on the plane. Data type — [Tuple](../../../sql-reference/data-types/tuple.md) — A tuple of two numbers.
|
||||
- `[(a, b), (c, d) ...]` — Polygon vertices. Data type — [Array](../../../sql-reference/data-types/array.md). Each vertex is represented by a pair of coordinates `(a, b)`. Vertices should be specified in a clockwise or counterclockwise order. The minimum number of vertices is 3. The polygon must be constant.
|
||||
- The function also supports polygons with holes (cut out sections). In this case, add polygons that define the cut out sections using additional arguments of the function. The function does not support non-simply-connected polygons.
|
||||
|
||||
**Returned values**
|
||||
|
||||
`1` if the point is inside the polygon, `0` if it is not.
|
||||
If the point is on the polygon boundary, the function may return either 0 or 1.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/functions/geo/coordinates) <!--hide-->
|
111
docs/en/sql-reference/functions/geo/geohash.md
Normal file
111
docs/en/sql-reference/functions/geo/geohash.md
Normal file
@ -0,0 +1,111 @@
|
||||
---
|
||||
toc_title: Geohash
|
||||
---
|
||||
|
||||
# Functions for Working with Geohash {#geohash}
|
||||
|
||||
[Geohash](https://en.wikipedia.org/wiki/Geohash) is the geocode system, which subdivides Earth’s surface into buckets of grid shape and encodes each cell into a short string of letters and digits. It is a hierarchical data structure, so the longer is the geohash string, the more precise is the geographic location.
|
||||
|
||||
If you need to manually convert geographic coordinates to geohash strings, you can use [geohash.org](http://geohash.org/).
|
||||
|
||||
## geohashEncode {#geohashencode}
|
||||
|
||||
Encodes latitude and longitude as a [geohash](#geohash)-string.
|
||||
|
||||
``` sql
|
||||
geohashEncode(longitude, latitude, [precision])
|
||||
```
|
||||
|
||||
**Input values**
|
||||
|
||||
- longitude - longitude part of the coordinate you want to encode. Floating in range`[-180°, 180°]`
|
||||
- latitude - latitude part of the coordinate you want to encode. Floating in range `[-90°, 90°]`
|
||||
- precision - Optional, length of the resulting encoded string, defaults to `12`. Integer in range `[1, 12]`. Any value less than `1` or greater than `12` is silently converted to `12`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- alphanumeric `String` of encoded coordinate (modified version of the base32-encoding alphabet is used).
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res──────────┐
|
||||
│ ezs42d000000 │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## geohashDecode {#geohashdecode}
|
||||
|
||||
Decodes any [geohash](#geohash)-encoded string into longitude and latitude.
|
||||
|
||||
**Input values**
|
||||
|
||||
- encoded string - geohash-encoded string.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- (longitude, latitude) - 2-tuple of `Float64` values of longitude and latitude.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT geohashDecode('ezs42') AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─────────────────────────────┐
|
||||
│ (-5.60302734375,42.60498046875) │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## geohashesInBox {#geohashesinbox}
|
||||
|
||||
Returns an array of [geohash](#geohash)-encoded strings of given precision that fall inside and intersect boundaries of given box, basically a 2D grid flattened into array.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `longitude_min` — Minimum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `latitude_min` — Minimum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `longitude_max` — Maximum longitude. Range: `[-180°, 180°]`. Type: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `latitude_max` — Maximum latitude. Range: `[-90°, 90°]`. Type: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `precision` — Geohash precision. Range: `[1, 12]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
!!! info "Note"
|
||||
All coordinate parameters must be of the same type: either `Float32` or `Float64`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Array of precision-long strings of geohash-boxes covering provided area, you should not rely on order of items.
|
||||
- `[]` - Empty array if minimum latitude and longitude values aren’t less than corresponding maximum values.
|
||||
|
||||
Type: [Array](../../../sql-reference/data-types/array.md)([String](../../../sql-reference/data-types/string.md)).
|
||||
|
||||
!!! info "Note"
|
||||
Function throws an exception if resulting array is over 10’000’000 items long.
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─thasos──────────────────────────────────────┐
|
||||
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/functions/geo/geohash) <!--hide-->
|
522
docs/en/sql-reference/functions/geo/h3.md
Normal file
522
docs/en/sql-reference/functions/geo/h3.md
Normal file
@ -0,0 +1,522 @@
|
||||
---
|
||||
toc_title: H3 Indexes
|
||||
---
|
||||
|
||||
# Functions for Working with H3 Indexes {#h3index}
|
||||
|
||||
[H3](https://eng.uber.com/h3/) is a geographical indexing system where Earth’s surface divided into a grid of even hexagonal cells. This system is hierarchical, i. e. each hexagon on the top level ("parent") can be splitted into seven even but smaller ones ("children"), and so on.
|
||||
|
||||
The level of the hierarchy is called `resolution` and can receive a value from `0` till `15`, where `0` is the `base` level with the largest and coarsest cells.
|
||||
|
||||
A latitude and longitude pair can be transformed to a 64-bit H3 index, identifying a grid cell.
|
||||
|
||||
The H3 index is used primarily for bucketing locations and other geospatial manipulations.
|
||||
|
||||
The full description of the H3 system is available at [the Uber Engeneering site](https://eng.uber.com/h3/).
|
||||
|
||||
## h3IsValid {#h3isvalid}
|
||||
|
||||
Verifies whether the number is a valid [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3IsValid(h3index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- 1 — The number is a valid H3 index.
|
||||
- 0 — The number is not a valid H3 index.
|
||||
|
||||
Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3IsValid(630814730351855103) as h3IsValid
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─h3IsValid─┐
|
||||
│ 1 │
|
||||
└───────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Defines the resolution of the given [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(h3index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Index resolution. Range: `[0, 15]`.
|
||||
- If the index is not valid, the function returns a random value. Use [h3IsValid](#h3isvalid) to verify the index.
|
||||
|
||||
Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(639821929606596015) as resolution
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─resolution─┐
|
||||
│ 14 │
|
||||
└────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeAngle {#h3edgeangle}
|
||||
|
||||
Calculates the average length of the [H3](#h3index) hexagon edge in grades.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3EdgeAngle(resolution)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- The average length of the [H3](#h3index) hexagon edge in grades. Type: [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeAngle(10) as edgeAngle
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌───────h3EdgeAngle(10)─┐
|
||||
│ 0.0005927224846720883 │
|
||||
└───────────────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeLengthM {#h3edgelengthm}
|
||||
|
||||
Calculates the average length of the [H3](#h3index) hexagon edge in meters.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3EdgeLengthM(resolution)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `resolution` — Index resolution. Type: [UInt8](../../../sql-reference/data-types/int-uint.md). Range: `[0, 15]`.
|
||||
|
||||
**Returned values**
|
||||
|
||||
- The average length of the [H3](#h3index) hexagon edge in meters. Type: [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeLengthM(15) as edgeLengthM
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─edgeLengthM─┐
|
||||
│ 0.509713273 │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## geoToH3 {#geotoh3}
|
||||
|
||||
Returns [H3](#h3index) point index `(lon, lat)` with specified resolution.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
geoToH3(lon, lat, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `lon` — Longitude. Type: [Float64](../../../sql-reference/data-types/float.md).
|
||||
- `lat` — Latitude. Type: [Float64](../../../sql-reference/data-types/float.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Hexagon index number.
|
||||
- 0 in case of error.
|
||||
|
||||
Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌────────────h3Index─┐
|
||||
│ 644325524701193974 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3kRing {#h3kring}
|
||||
|
||||
Lists all the [H3](#h3index) hexagons in the raduis of `k` from the given hexagon in random order.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3kRing(h3index, k)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `h3index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `k` — Raduis. Type: [integer](../../../sql-reference/data-types/int-uint.md)
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Array of H3 indexes.
|
||||
|
||||
Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index
|
||||
```
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌────────────h3index─┐
|
||||
│ 644325529233966508 │
|
||||
│ 644325529233966497 │
|
||||
│ 644325529233966510 │
|
||||
│ 644325529233966504 │
|
||||
│ 644325529233966509 │
|
||||
│ 644325529233966355 │
|
||||
│ 644325529233966354 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetBaseCell {#h3getbasecell}
|
||||
|
||||
Returns the base cell number of the [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3GetBaseCell(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Hexagon base cell number.
|
||||
|
||||
Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetBaseCell(612916788725809151) as basecell;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─basecell─┐
|
||||
│ 12 │
|
||||
└──────────┘
|
||||
```
|
||||
|
||||
## h3HexAreaM2 {#h3hexaream2}
|
||||
|
||||
Returns average hexagon area in square meters at the given resolution.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3HexAreaM2(resolution)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Area in square meters.
|
||||
|
||||
Type: [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3HexAreaM2(13) as area;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─area─┐
|
||||
│ 43.9 │
|
||||
└──────┘
|
||||
```
|
||||
|
||||
## h3IndexesAreNeighbors {#h3indexesareneighbors}
|
||||
|
||||
Returns whether or not the provided [H3](#h3index) indexes are neighbors.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3IndexesAreNeighbors(index1, index2)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index1` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `index2` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- `1` — Indexes are neighbours.
|
||||
- `0` — Indexes are not neighbours.
|
||||
|
||||
Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─n─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
## h3ToChildren {#h3tochildren}
|
||||
|
||||
Returns an array of child indexes for the given [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3ToChildren(index, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned values**
|
||||
|
||||
- Array of the child H3-indexes.
|
||||
|
||||
Type: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToChildren(599405990164561919, 6) AS children;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToParent {#h3toparent}
|
||||
|
||||
Returns the parent (coarser) index containing the given [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3ToParent(index, resolution)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Parent H3 index.
|
||||
|
||||
Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToParent(599405990164561919, 3) as parent;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─────────────parent─┐
|
||||
│ 590398848891879423 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToString {#h3tostring}
|
||||
|
||||
Converts the `H3Index` representation of the index to the string representation.
|
||||
|
||||
``` sql
|
||||
h3ToString(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- String representation of the H3 index.
|
||||
|
||||
Type: [String](../../../sql-reference/data-types/string.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToString(617420388352917503) as h3_string;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─h3_string───────┐
|
||||
│ 89184926cdbffff │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## stringToH3 {#stringtoh3}
|
||||
|
||||
Converts the string representation to the `H3Index` (UInt64) representation.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
stringToH3(index_str)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index_str` — String representation of the H3 index. Type: [String](../../../sql-reference/data-types/string.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Hexagon index number. Returns 0 on error. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT stringToH3('89184926cc3ffff') as index;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌──────────────index─┐
|
||||
│ 617420388351344639 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Returns the resolution of the [H3](#h3index) index.
|
||||
|
||||
**Syntax**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(index)
|
||||
```
|
||||
|
||||
**Parameter**
|
||||
|
||||
- `index` — Hexagon index number. Type: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Returned value**
|
||||
|
||||
- Index resolution. Range: `[0, 15]`. Type: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Example**
|
||||
|
||||
Query:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(617420388352917503) as res;
|
||||
```
|
||||
|
||||
Result:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 9 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/functions/geo/h3) <!--hide-->
|
8
docs/en/sql-reference/functions/geo/index.md
Normal file
8
docs/en/sql-reference/functions/geo/index.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
toc_title: hidden
|
||||
toc_priority: 62
|
||||
toc_folder_title: Geo
|
||||
---
|
||||
|
||||
|
||||
[Original article](https://clickhouse.tech/docs/en/sql-reference/functions/geo/) <!--hide-->
|
@ -1297,7 +1297,7 @@ Default value: 0.
|
||||
- [Управление распределёнными таблицами](../../sql-reference/statements/system.md#query-language-system-distributed)
|
||||
## validate\_polygons {#validate_polygons}
|
||||
|
||||
Включает или отключает генерирование исключения в функции [pointInPolygon](../../sql-reference/functions/geo.md#pointinpolygon), если многоугольник самопересекающийся или самокасающийся.
|
||||
Включает или отключает генерирование исключения в функции [pointInPolygon](../../sql-reference/functions/geo/index.md#pointinpolygon), если многоугольник самопересекающийся или самокасающийся.
|
||||
|
||||
Допустимые значения:
|
||||
|
||||
|
@ -78,7 +78,7 @@ SELECT * FROM system.asynchronous_metric_log LIMIT 10
|
||||
```
|
||||
|
||||
**Смотрите также**
|
||||
- [system.asynchronous_metrics](../../operations/system-tables/asynchronous-metrics.md) — Содержит метрики, которые периодически вычисляются в фоновом режиме.
|
||||
- [system.asynchronous_metrics](#system_tables-asynchronous_metrics) — Содержит метрики, которые периодически вычисляются в фоновом режиме.
|
||||
- [system.metric_log](#system_tables-metric_log) — таблица фиксирующая историю значений метрик из `system.metrics` и `system.events`.
|
||||
|
||||
## system.clusters {#system-clusters}
|
||||
|
@ -1,676 +0,0 @@
|
||||
# Функции для работы с географическими координатами {#funktsii-dlia-raboty-s-geograficheskimi-koordinatami}
|
||||
|
||||
## greatCircleDistance {#greatcircledistance}
|
||||
|
||||
Вычисляет расстояние между двумя точками на поверхности Земли по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `lon1Deg` — долгота первой точки в градусах. Диапазон — `[-180°, 180°]`.
|
||||
- `lat1Deg` — широта первой точки в градусах. Диапазон — `[-90°, 90°]`.
|
||||
- `lon2Deg` — долгота второй точки в градусах. Диапазон — `[-180°, 180°]`.
|
||||
- `lat2Deg` — широта второй точки в градусах. Диапазон — `[-90°, 90°]`.
|
||||
|
||||
Положительные значения соответствуют северной широте и восточной долготе, отрицательные — южной широте и западной долготе.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
Расстояние между двумя точками на поверхности Земли в метрах.
|
||||
|
||||
Генерирует исключение, когда значения входных параметров выходят за границы диапазонов.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
|
||||
│ 14132374.194975413 │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## greatCircleAngle {#greatcircleangle}
|
||||
|
||||
Вычисляет угловое расстояние на сфере по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `lon1Deg` — долгота первой точки в градусах.
|
||||
- `lat1Deg` — широта первой точки в градусах.
|
||||
- `lon2Deg` — долгота второй точки в градусах.
|
||||
- `lat2Deg` — широта второй точки в градусах.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
Длина дуги большого круга между двумя точками в градусах.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─arc─┐
|
||||
│ 45 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## pointInEllipses {#pointinellipses}
|
||||
|
||||
Проверяет, принадлежит ли точка хотя бы одному из эллипсов.
|
||||
Координаты — геометрические в декартовой системе координат.
|
||||
|
||||
pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `x, y` — координаты точки на плоскости.
|
||||
- `xᵢ, yᵢ` — координаты центра `i`-го эллипса.
|
||||
- `aᵢ, bᵢ` — полуоси `i`-го эллипса (в единицах измерения координат x,y).
|
||||
|
||||
Входных параметров должно быть `2+4⋅n`, где `n` — количество эллипсов.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
`1`, если точка внутри хотя бы одного из эллипсов, `0`, если нет.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## pointInPolygon {#pointinpolygon}
|
||||
|
||||
Проверяет, принадлежит ли точка многоугольнику на плоскости.
|
||||
|
||||
``` sql
|
||||
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `(x, y)` — координаты точки на плоскости. Тип данных — [Tuple](../../sql-reference/functions/geo.md) — кортеж из двух чисел.
|
||||
- `[(a, b), (c, d) ...]` — вершины многоугольника. Тип данных — [Array](../../sql-reference/functions/geo.md). Каждая вершина представлена парой координат `(a, b)`. Вершины следует указывать в порядке обхода по или против часовой стрелки. Минимальное количество вершин — 3. Многоугольник должен быть константным.
|
||||
- функция поддерживает также многоугольники с дырками (вырезанными кусками). Для этого случая, добавьте многоугольники, описывающие вырезанные куски, дополнительными аргументами функции. Функция не поддерживает не односвязные многоугольники.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
`1`, если точка внутри многоугольника, `0`, если нет.
|
||||
Если точка находится на границе многоугольника, функция может возвращать как 0, так и 1.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## geohashEncode {#geohashencode}
|
||||
|
||||
Кодирует широту и долготу в строку geohash, смотрите http://geohash.org/, https://en.wikipedia.org/wiki/Geohash.
|
||||
|
||||
``` sql
|
||||
geohashEncode(longitude, latitude, [precision])
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- longitude — долгота. Диапазон — `[-180°, 180°].`
|
||||
- latitude — широта. Диапазон — `[-90°, 90°].`
|
||||
- precision — длина результирующей строки, по умолчанию `12`. Опционально. Целое число в диапазоне `[1, 12]`. Любое значение меньше, чем `1` или больше `12` автоматически преобразуются в `12`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Строка с координатой, закодированной модифицированной версией алфавита base32.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res──────────┐
|
||||
│ ezs42d000000 │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## geohashDecode {#geohashdecode}
|
||||
|
||||
Декодирует любую строку, закодированную в geohash, на долготу и широту.
|
||||
|
||||
``` sql
|
||||
geohashDecode(geohash_string)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `geohash_string` — строка, содержащая geohash.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- `(longitude, latitude)` — широта и долгота. Кортеж из двух значений типа `Float64`.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT geohashDecode('ezs42') AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─────────────────────────────┐
|
||||
│ (-5.60302734375,42.60498046875) │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3IsValid {#h3isvalid}
|
||||
|
||||
Проверяет корректность H3-индекса.
|
||||
|
||||
``` sql
|
||||
h3IsValid(h3index)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `h3index` — идентификатор шестиугольника. Тип данных — [UInt64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- 0 — число не является H3-индексом
|
||||
- 1 — число является H3-индексом
|
||||
|
||||
Тип — [UInt8](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT h3IsValid(630814730351855103) as h3IsValid
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─h3IsValid─┐
|
||||
│ 1 │
|
||||
└───────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Извлекает разрешение H3-индекса.
|
||||
|
||||
``` sql
|
||||
h3GetResolution(h3index)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `h3index` — идентификатор шестиугольника. Тип данных — [UInt64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Разрешение сетки, от 0 до 15.
|
||||
- Для несуществующего идентификатора может быть возвращено произвольное значение, используйте [h3IsValid](#h3isvalid) для проверки идентификаторов
|
||||
|
||||
Тип — [UInt8](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(639821929606596015) as resolution
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─resolution─┐
|
||||
│ 14 │
|
||||
└────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeAngle {#h3edgeangle}
|
||||
|
||||
Информирует о среднем размере стороны шестигранника H3 в градусах
|
||||
|
||||
``` sql
|
||||
h3EdgeAngle(resolution)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных — [UInt8](../../sql-reference/functions/geo.md). Диапазон возможных значений — `[0, 15]`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
Средняя длина стороны многоугольника H3 в градусах, тип — [Float64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeAngle(10) as edgeAngle
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─────────h3EdgeAngle(10)─┐
|
||||
│ 0.0005927224846720883 │
|
||||
└───────────────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeLengthM {#h3edgelengthm}
|
||||
|
||||
Информирует о среднем размере стороны шестигранника H3 в метрах
|
||||
|
||||
``` sql
|
||||
h3EdgeLengthM(resolution)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных — [UInt8](../../sql-reference/functions/geo.md). Диапазон возможных значений — `[0, 15]`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
Средняя длина стороны многоугольника H3 в метрах, тип — [Float64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeLengthM(15) as edgeLengthM
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─edgeLengthM─┐
|
||||
│ 0.509713273 │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## geoToH3 {#geotoh3}
|
||||
|
||||
Возвращает H3 индекс точки `(lon, lat)` с заданным разрешением.
|
||||
|
||||
[H3](https://uber.github.io/h3/#/documentation/overview/introduction) - это географическая система индексации, в которой поверхность Земли разделена на ровные шестиугольные плитки. Эта система иерархична, то есть каждый шестиугольник на верхнем уровне может быть разбит на семь еще более мелких и так далее.
|
||||
|
||||
H3 индекс используется в основном для определения местоположения с помощью карт и других геопространственных манипуляций.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
geoToH3(lon, lat, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `lon` — географическая долгота. Тип данных — [Float64](../../sql-reference/functions/geo.md).
|
||||
- `lat` — географическая широта. Тип данных — [Float64](../../sql-reference/functions/geo.md).
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных — [UInt8](../../sql-reference/functions/geo.md). Диапазон возможных значений — `[0, 15]`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Порядковый номер шестиугольника.
|
||||
- 0 в случае ошибки.
|
||||
|
||||
Тип — [UInt64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
``` text
|
||||
┌────────────h3Index─┐
|
||||
│ 644325524701193974 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3kRing {#h3kring}
|
||||
|
||||
Возвращает H3-индексы шестиугольников в радиусе `k` от данного в произвольном порядке
|
||||
|
||||
``` sql
|
||||
h3kRing(h3index, k)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `h3index` — идентификатор шестиугольника. Тип данных — [UInt64](../../sql-reference/functions/geo.md).
|
||||
- `k` — радиус. Тип данных — [целое число](../../sql-reference/functions/geo.md)
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
[Массив](../../sql-reference/functions/geo.md) из H3-индексов типа [UInt64](../../sql-reference/functions/geo.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index
|
||||
```
|
||||
|
||||
``` text
|
||||
┌────────────h3index─┐
|
||||
│ 644325529233966508 │
|
||||
│ 644325529233966497 │
|
||||
│ 644325529233966510 │
|
||||
│ 644325529233966504 │
|
||||
│ 644325529233966509 │
|
||||
│ 644325529233966355 │
|
||||
│ 644325529233966354 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetBaseCell {#h3getbasecell}
|
||||
|
||||
Определяет номер базовой (верхнеуровневой) шестиугольной H3-ячейки для указанной ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3GetBaseCell(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Индекс базовой шестиугольной ячейки.
|
||||
|
||||
Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetBaseCell(612916788725809151) as basecell;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─basecell─┐
|
||||
│ 12 │
|
||||
└──────────┘
|
||||
```
|
||||
|
||||
## h3HexAreaM2 {#h3hexaream2}
|
||||
|
||||
Определяет среднюю площадь шестиугольной H3-ячейки заданного разрешения в квадратных метрах.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3HexAreaM2(resolution)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`.
|
||||
|
||||
Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Площадь в квадратных метрах. Тип: [Float64](../../sql-reference/data-types/float.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3HexAreaM2(13) as area;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─area─┐
|
||||
│ 43.9 │
|
||||
└──────┘
|
||||
```
|
||||
|
||||
## h3IndexesAreNeighbors {#h3indexesareneighbors}
|
||||
|
||||
Определяет, являются ли H3-ячейки соседями.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3IndexesAreNeighbors(index1, index2)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index1` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `index2` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- `1` — ячейки являются соседями.
|
||||
- `0` — ячейки не являются соседями.
|
||||
|
||||
Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─n─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
## h3ToChildren {#h3tochildren}
|
||||
|
||||
Формирует массив дочерних (вложенных) H3-ячеек для указанной ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3ToChildren(index, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`. Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Массив дочерних H3-ячеек.
|
||||
|
||||
Тип: [Array](../../sql-reference/data-types/array.md)([UInt64](../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToChildren(599405990164561919, 6) AS children;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToParent {#h3toparent}
|
||||
|
||||
Определяет родительскую (более крупную) H3-ячейку, содержащую указанную ячейку.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3ToParent(index, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`. Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Индекс родительской H3-ячейки.
|
||||
|
||||
Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToParent(599405990164561919, 3) as parent;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─────────────parent─┐
|
||||
│ 590398848891879423 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToString {#h3tostring}
|
||||
|
||||
Преобразует H3-индекс из числового представления `H3Index` в строковое.
|
||||
|
||||
``` sql
|
||||
h3ToString(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Строковое представление H3-индекса.
|
||||
|
||||
Тип: [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToString(617420388352917503) as h3_string;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─h3_string───────┐
|
||||
│ 89184926cdbffff │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## stringToH3 {#stringtoh3}
|
||||
|
||||
Преобразует H3-индекс из строкового представления в числовое представление `H3Index`.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
stringToH3(index_str)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index_str` — строковое представление H3-индекса. Тип: [String](../../sql-reference/data-types/string.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Числовое представление индекса шестиугольной ячейки.
|
||||
- `0`, если при преобразовании возникла ошибка.
|
||||
|
||||
Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT stringToH3('89184926cc3ffff') as index;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌──────────────index─┐
|
||||
│ 617420388351344639 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Определяет разрешение H3-ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Разрешение ячейки. Диапазон: `[0, 15]`.
|
||||
|
||||
Тип: [UInt8](../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(617420388352917503) as res;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 9 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/functions/geo/) <!--hide-->
|
135
docs/ru/sql-reference/functions/geo/coordinates.md
Normal file
135
docs/ru/sql-reference/functions/geo/coordinates.md
Normal file
@ -0,0 +1,135 @@
|
||||
---
|
||||
toc_title: Функции для работы с географическими координатами
|
||||
---
|
||||
|
||||
# Функции для работы с географическими координатами {#geographical-coordinates}
|
||||
|
||||
## greatCircleDistance {#greatcircledistance}
|
||||
|
||||
Вычисляет расстояние между двумя точками на поверхности Земли по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `lon1Deg` — долгота первой точки в градусах. Диапазон — `[-180°, 180°]`.
|
||||
- `lat1Deg` — широта первой точки в градусах. Диапазон — `[-90°, 90°]`.
|
||||
- `lon2Deg` — долгота второй точки в градусах. Диапазон — `[-180°, 180°]`.
|
||||
- `lat2Deg` — широта второй точки в градусах. Диапазон — `[-90°, 90°]`.
|
||||
|
||||
Положительные значения соответствуют северной широте и восточной долготе, отрицательные — южной широте и западной долготе.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
Расстояние между двумя точками на поверхности Земли в метрах.
|
||||
|
||||
Генерирует исключение, когда значения входных параметров выходят за границы диапазонов.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673)─┐
|
||||
│ 14132374.194975413 │
|
||||
└───────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## greatCircleAngle {#greatcircleangle}
|
||||
|
||||
Вычисляет угловое расстояние на сфере по [формуле большого круга](https://en.wikipedia.org/wiki/Great-circle_distance).
|
||||
|
||||
``` sql
|
||||
greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)
|
||||
```
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `lon1Deg` — долгота первой точки в градусах.
|
||||
- `lat1Deg` — широта первой точки в градусах.
|
||||
- `lon2Deg` — долгота второй точки в градусах.
|
||||
- `lat2Deg` — широта второй точки в градусах.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
Длина дуги большого круга между двумя точками в градусах.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT greatCircleAngle(0, 0, 45, 0) AS arc
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─arc─┐
|
||||
│ 45 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## pointInEllipses {#pointinellipses}
|
||||
|
||||
Проверяет, принадлежит ли точка хотя бы одному из эллипсов.
|
||||
Координаты — геометрические в декартовой системе координат.
|
||||
|
||||
pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)
|
||||
|
||||
**Входные параметры**
|
||||
|
||||
- `x, y` — координаты точки на плоскости.
|
||||
- `xᵢ, yᵢ` — координаты центра `i`-го эллипса.
|
||||
- `aᵢ, bᵢ` — полуоси `i`-го эллипса (в единицах измерения координат x,y).
|
||||
|
||||
Входных параметров должно быть `2+4⋅n`, где `n` — количество эллипсов.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
`1`, если точка внутри хотя бы одного из эллипсов, `0`, если нет.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
|
||||
│ 1 │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## pointInPolygon {#pointinpolygon}
|
||||
|
||||
Проверяет, принадлежит ли точка многоугольнику на плоскости.
|
||||
|
||||
``` sql
|
||||
pointInPolygon((x, y), [(a, b), (c, d) ...], ...)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `(x, y)` — координаты точки на плоскости. Тип данных — [Tuple](../../data-types/tuple.md) — кортеж из двух чисел.
|
||||
- `[(a, b), (c, d) ...]` — вершины многоугольника. Тип данных — [Array](../../data-types/array.md). Каждая вершина представлена парой координат `(a, b)`. Вершины следует указывать в порядке обхода по или против часовой стрелки. Минимальное количество вершин — 3. Многоугольник должен быть константным.
|
||||
- функция поддерживает также многоугольники с дырками (вырезанными кусками). Для этого случая, добавьте многоугольники, описывающие вырезанные куски, дополнительными аргументами функции. Функция не поддерживает не односвязные многоугольники.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
`1`, если точка внутри многоугольника, `0`, если нет.
|
||||
Если точка находится на границе многоугольника, функция может возвращать как 0, так и 1.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/functions/geo/coordinates) <!--hide-->
|
115
docs/ru/sql-reference/functions/geo/geohash.md
Normal file
115
docs/ru/sql-reference/functions/geo/geohash.md
Normal file
@ -0,0 +1,115 @@
|
||||
---
|
||||
toc_title: Geohash
|
||||
---
|
||||
|
||||
# Функции для работы с системой Geohash {#geohash}
|
||||
|
||||
[Geohash](https://en.wikipedia.org/wiki/Geohash) — это система геокодирования, которая делит поверхность Земли на участки в виде "решетки", и каждую ячейку решетки кодирует в виде строки из букв и цифр. Система поддерживает иерархию (вложенность) ячеек, поэтому чем точнее определена геопозиция, тем длиннее строка с кодом соответствующей ячейки.
|
||||
|
||||
Для ручного преобразования географических координат в строку geohash можно использовать сайт [geohash.org](http://geohash.org/).
|
||||
|
||||
## geohashEncode {#geohashencode}
|
||||
|
||||
Кодирует широту и долготу в строку [geohash](#geohash).
|
||||
|
||||
``` sql
|
||||
geohashEncode(longitude, latitude, [precision])
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- longitude — долгота. Диапазон — `[-180°, 180°].`
|
||||
- latitude — широта. Диапазон — `[-90°, 90°].`
|
||||
- precision — длина результирующей строки, по умолчанию `12`. Опционально. Целое число в диапазоне `[1, 12]`. Любое значение меньше, чем `1` или больше `12` автоматически преобразуются в `12`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Строка с координатой, закодированной модифицированной версией алфавита base32.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res──────────┐
|
||||
│ ezs42d000000 │
|
||||
└──────────────┘
|
||||
```
|
||||
|
||||
## geohashDecode {#geohashdecode}
|
||||
|
||||
Декодирует любую строку, закодированную в [geohash](#geohash), на долготу и широту.
|
||||
|
||||
``` sql
|
||||
geohashDecode(geohash_string)
|
||||
```
|
||||
|
||||
**Входные значения**
|
||||
|
||||
- `geohash_string` — строка, содержащая geohash.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- `(longitude, latitude)` — широта и долгота. Кортеж из двух значений типа `Float64`.
|
||||
|
||||
**Пример**
|
||||
|
||||
``` sql
|
||||
SELECT geohashDecode('ezs42') AS res
|
||||
```
|
||||
|
||||
``` text
|
||||
┌─res─────────────────────────────┐
|
||||
│ (-5.60302734375,42.60498046875) │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
## geohashesInBox {#geohashesinbox}
|
||||
|
||||
Формирует массив участков, которые находятся внутри или пересекают границу заданного участка на поверхности. Каждый участок описывается строкой [geohash](#geohash) заданной точности.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `longitude_min` — минимальная долгота. Диапазон возможных значений: `[-180°, 180°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md)).
|
||||
- `latitude_min` - минимальная широта. Диапазон возможных значений: `[-90°, 90°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `longitude_max` - максимальная долгота. Диапазон возможных значений: `[-180°, 180°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `latitude_max` - максимальная широта. Диапазон возможных значений: `[-90°, 90°]`. Тип данных: [Float](../../../sql-reference/data-types/float.md).
|
||||
- `precision` - точность geohash. Диапазон возможных значений: `[1, 12]`. Тип данных: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
!!! info "Замечание"
|
||||
Все передаваемые координаты должны быть одного и того же типа: либо `Float32`, либо `Float64`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Массив строк, описывающих участки, покрывающие заданный участок. Длина каждой строки соответствует точности geohash. Порядок строк — произвольный.
|
||||
- \[\] - Если переданные минимальные значения широты и долготы больше соответствующих максимальных значений, функция возвращает пустой массив.
|
||||
|
||||
Тип данных: [Array](../../../sql-reference/data-types/array.md)([String](../../../sql-reference/data-types/string.md)).
|
||||
|
||||
!!! info "Замечание"
|
||||
Если возвращаемый массив содержит свыше 10 000 000 элементов, функция сгенерирует исключение.
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─thasos──────────────────────────────────────┐
|
||||
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/functions/geo/geohash) <!--hide-->
|
523
docs/ru/sql-reference/functions/geo/h3.md
Normal file
523
docs/ru/sql-reference/functions/geo/h3.md
Normal file
@ -0,0 +1,523 @@
|
||||
---
|
||||
toc_title: Индексы H3
|
||||
---
|
||||
|
||||
# Функции для работы с индексами H3 {#h3index}
|
||||
|
||||
[H3](https://eng.uber.com/h3/) — это система геокодирования, которая делит поверхность Земли на равные шестигранные ячейки. Система поддерживает иерархию (вложенность) ячеек, т.е. каждый "родительский" шестигранник может быть поделен на семь одинаковых вложенных "дочерних" шестигранников, и так далее.
|
||||
|
||||
Уровень вложенности назвается `разрешением` и может принимать значение от `0` до `15`, где `0` соответствует `базовым` ячейкам самого верхнего уровня (наиболее крупным).
|
||||
|
||||
Для каждой точки, имеющей широту и долготу, можно получить 64-битный индекс H3, соответствующий номеру шестигранной ячейки, где эта точка находится.
|
||||
|
||||
Индексы H3 используются, в основном, для геопозиционирования и расчета расстояний.
|
||||
|
||||
## h3IsValid {#h3isvalid}
|
||||
|
||||
Проверяет корректность [H3](#h3index)-индекса.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3IsValid(h3index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `h3index` — идентификатор шестигранника. Тип данных: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- 1 — число является H3-индексом.
|
||||
- 0 — число не является H3-индексом.
|
||||
|
||||
Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3IsValid(630814730351855103) as h3IsValid
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─h3IsValid─┐
|
||||
│ 1 │
|
||||
└───────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Извлекает разрешение [H3](#h3index)-индекса.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(h3index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `h3index` — идентификатор шестигранника. Тип данных: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Разрешение сетки. Диапазон значений: `[0, 15]`.
|
||||
- Для несуществующего идентификатора может быть возвращено произвольное значение. Используйте [h3IsValid](#h3isvalid) для проверки идентификаторов.
|
||||
|
||||
Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(639821929606596015) as resolution
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─resolution─┐
|
||||
│ 14 │
|
||||
└────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeAngle {#h3edgeangle}
|
||||
|
||||
Рассчитывает средний размер стороны шестигранника [H3](#h3index) в градусах.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3EdgeAngle(resolution)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных: [UInt8](../../../sql-reference/data-types/int-uint.md). Диапазон возможных значений: `[0, 15]`.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Средняя длина стороны шестигранника [H3](#h3index) в градусах. Тип данных: [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeAngle(10) as edgeAngle
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌───────h3EdgeAngle(10)─┐
|
||||
│ 0.0005927224846720883 │
|
||||
└───────────────────────┘
|
||||
```
|
||||
|
||||
## h3EdgeLengthM {#h3edgelengthm}
|
||||
|
||||
Рассчитывает средний размер стороны шестигранника [H3](#h3index) в метрах.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3EdgeLengthM(resolution)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных — [UInt8](../../../sql-reference/data-types/int-uint.md). Диапазон возможных значений — `[0, 15]`.
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Средняя длина стороны шестигранника H3 в метрах, тип — [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3EdgeLengthM(15) as edgeLengthM
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─edgeLengthM─┐
|
||||
│ 0.509713273 │
|
||||
└─────────────┘
|
||||
```
|
||||
|
||||
## geoToH3 {#geotoh3}
|
||||
|
||||
Возвращает [H3](#h3index) индекс точки `(lon, lat)` с заданным разрешением.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
geoToH3(lon, lat, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `lon` — географическая долгота. Тип данных — [Float64](../../../sql-reference/data-types/float.md).
|
||||
- `lat` — географическая широта. Тип данных — [Float64](../../../sql-reference/data-types/float.md).
|
||||
- `resolution` — требуемое разрешение индекса. Тип данных — [UInt8](../../../sql-reference/data-types/int-uint.md). Диапазон возможных значений — `[0, 15]`.
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Порядковый номер шестигранника.
|
||||
- 0 в случае ошибки.
|
||||
|
||||
Тип данных: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
``` text
|
||||
┌────────────h3Index─┐
|
||||
│ 644325524701193974 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3kRing {#h3kring}
|
||||
|
||||
Возвращает [H3](#h3index)-индексы шестигранников в радиусе `k` от данного в произвольном порядке.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3kRing(h3index, k)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `h3index` — идентификатор шестигранника. Тип данных: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `k` — радиус. Тип данных: [целое число](../../../sql-reference/data-types/int-uint.md)
|
||||
|
||||
**Возвращаемые значения**
|
||||
|
||||
- Массив из H3-индексов.
|
||||
|
||||
Тип данных: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index
|
||||
```
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌────────────h3index─┐
|
||||
│ 644325529233966508 │
|
||||
│ 644325529233966497 │
|
||||
│ 644325529233966510 │
|
||||
│ 644325529233966504 │
|
||||
│ 644325529233966509 │
|
||||
│ 644325529233966355 │
|
||||
│ 644325529233966354 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetBaseCell {#h3getbasecell}
|
||||
|
||||
Определяет номер базовой (верхнеуровневой) шестиугольной [H3](#h3index)-ячейки для указанной ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3GetBaseCell(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Индекс базовой шестиугольной ячейки.
|
||||
|
||||
Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetBaseCell(612916788725809151) as basecell;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─basecell─┐
|
||||
│ 12 │
|
||||
└──────────┘
|
||||
```
|
||||
|
||||
## h3HexAreaM2 {#h3hexaream2}
|
||||
|
||||
Определяет среднюю площадь шестиугольной [H3](#h3index)-ячейки заданного разрешения в квадратных метрах.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3HexAreaM2(resolution)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Площадь в квадратных метрах. Тип: [Float64](../../../sql-reference/data-types/float.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3HexAreaM2(13) as area;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─area─┐
|
||||
│ 43.9 │
|
||||
└──────┘
|
||||
```
|
||||
|
||||
## h3IndexesAreNeighbors {#h3indexesareneighbors}
|
||||
|
||||
Определяет, являются ли [H3](#h3index)-ячейки соседями.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3IndexesAreNeighbors(index1, index2)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index1` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `index2` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- `1` — ячейки являются соседями.
|
||||
- `0` — ячейки не являются соседями.
|
||||
|
||||
Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─n─┐
|
||||
│ 1 │
|
||||
└───┘
|
||||
```
|
||||
|
||||
## h3ToChildren {#h3tochildren}
|
||||
|
||||
Формирует массив дочерних (вложенных) [H3](#h3index)-ячеек для указанной ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3ToChildren(index, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Массив дочерних H3-ячеек.
|
||||
|
||||
Тип: [Array](../../../sql-reference/data-types/array.md)([UInt64](../../../sql-reference/data-types/int-uint.md)).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToChildren(599405990164561919, 6) AS children;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
|
||||
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToParent {#h3toparent}
|
||||
|
||||
Определяет родительскую (более крупную) [H3](#h3index)-ячейку, содержащую указанную ячейку.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3ToParent(index, resolution)
|
||||
```
|
||||
|
||||
**Параметры**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
- `resolution` — разрешение. Диапазон: `[0, 15]`. Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Индекс родительской H3-ячейки.
|
||||
|
||||
Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToParent(599405990164561919, 3) as parent;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─────────────parent─┐
|
||||
│ 590398848891879423 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3ToString {#h3tostring}
|
||||
|
||||
Преобразует [H3](#h3index)-индекс из числового представления `H3Index` в строковое.
|
||||
|
||||
``` sql
|
||||
h3ToString(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Строковое представление H3-индекса.
|
||||
|
||||
Тип: [String](../../../sql-reference/data-types/string.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3ToString(617420388352917503) as h3_string;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─h3_string───────┐
|
||||
│ 89184926cdbffff │
|
||||
└─────────────────┘
|
||||
```
|
||||
|
||||
## stringToH3 {#stringtoh3}
|
||||
|
||||
Преобразует [H3](#h3index)-индекс из строкового представления в числовое представление `H3Index`.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
stringToH3(index_str)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index_str` — строковое представление H3-индекса. Тип: [String](../../../sql-reference/data-types/string.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Числовое представление индекса шестиугольной ячейки.
|
||||
- `0`, если при преобразовании возникла ошибка.
|
||||
|
||||
Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT stringToH3('89184926cc3ffff') as index;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌──────────────index─┐
|
||||
│ 617420388351344639 │
|
||||
└────────────────────┘
|
||||
```
|
||||
|
||||
## h3GetResolution {#h3getresolution}
|
||||
|
||||
Определяет разрешение [H3](#h3index)-ячейки.
|
||||
|
||||
**Синтаксис**
|
||||
|
||||
``` sql
|
||||
h3GetResolution(index)
|
||||
```
|
||||
|
||||
**Параметр**
|
||||
|
||||
- `index` — индекс шестиугольной ячейки. Тип: [UInt64](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Возвращаемое значение**
|
||||
|
||||
- Разрешение ячейки. Диапазон: `[0, 15]`.
|
||||
|
||||
Тип: [UInt8](../../../sql-reference/data-types/int-uint.md).
|
||||
|
||||
**Пример**
|
||||
|
||||
Запрос:
|
||||
|
||||
``` sql
|
||||
SELECT h3GetResolution(617420388352917503) as res;
|
||||
```
|
||||
|
||||
Результат:
|
||||
|
||||
``` text
|
||||
┌─res─┐
|
||||
│ 9 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/functions/geo/h3) <!--hide-->
|
8
docs/ru/sql-reference/functions/geo/index.md
Normal file
8
docs/ru/sql-reference/functions/geo/index.md
Normal file
@ -0,0 +1,8 @@
|
||||
---
|
||||
toc_priority: 62
|
||||
toc_folder_title: hidden
|
||||
toc_title: Функции для работы с географическими координатами
|
||||
---
|
||||
|
||||
|
||||
[Оригинальная статья](https://clickhouse.tech/docs/ru/sql-reference/functions/geo/) <!--hide-->
|
@ -9,11 +9,11 @@
|
||||
3. 函数可以随意的在多层嵌套结构下查找字段。如果存在多个匹配字段,则返回第一个匹配字段。
|
||||
4. JSON除字符串文本外不存在空格字符。
|
||||
|
||||
## ツ环板(ョツ嘉ッツ偲青visャツ静ャツ青サツ催ャツ渉) {#visitparamhasparams-name}
|
||||
## visitParamHas(参数,名称) {#visitparamhasparams-name}
|
||||
|
||||
检查是否存在«name»名称的字段
|
||||
|
||||
## 访问paramextractuint(参数,名称) {#visitparamextractuintparams-name}
|
||||
## visitParamExtractUInt(参数,名称) {#visitparamextractuintparams-name}
|
||||
|
||||
将名为«name»的字段的值解析成UInt64。如果这是一个字符串字段,函数将尝试从字符串的开头解析一个数字。如果该字段不存在,或无法从它中解析到数字,则返回0。
|
||||
|
||||
@ -21,15 +21,15 @@
|
||||
|
||||
与visitParamExtractUInt相同,但返回Int64。
|
||||
|
||||
## 访问paramextractfloat(参数,名称) {#visitparamextractfloatparams-name}
|
||||
## visitParamExtractFloat(参数,名称) {#visitparamextractfloatparams-name}
|
||||
|
||||
与visitParamExtractUInt相同,但返回Float64。
|
||||
|
||||
## ツ环板(ョツ嘉ッツ偲青妥-ツ姪(不ツ督ョツ産) {#visitparamextractboolparams-name}
|
||||
## visitParamExtractBool(参数,名称) {#visitparamextractboolparams-name}
|
||||
|
||||
解析true/false值。其结果是UInt8类型的。
|
||||
|
||||
## 掳胫((禄脢鹿脷露胫鲁隆鹿((酶-11-16""\[脪陆(,,,) {#visitparamextractrawparams-name}
|
||||
## visitParamExtractRaw(参数,名称) {#visitparamextractrawparams-name}
|
||||
|
||||
返回字段的值,包含空格符。
|
||||
|
||||
|
@ -32,7 +32,7 @@ namespace ErrorCodes
|
||||
|
||||
static const std::vector<String> supported_functions{"any", "anyLast", "min",
|
||||
"max", "sum", "sumWithOverflow", "groupBitAnd", "groupBitOr", "groupBitXor",
|
||||
"sumMap", "groupArrayArray", "groupUniqArrayArray"};
|
||||
"sumMap", "minMap", "maxMap", "groupArrayArray", "groupUniqArrayArray"};
|
||||
|
||||
|
||||
String DataTypeCustomSimpleAggregateFunction::getName() const
|
||||
|
@ -193,6 +193,7 @@ DictionaryStructure::DictionaryStructure(const Poco::Util::AbstractConfiguration
|
||||
}
|
||||
|
||||
attributes = getAttributes(config, config_prefix);
|
||||
|
||||
if (attributes.empty())
|
||||
throw Exception{"Dictionary has no attributes defined", ErrorCodes::BAD_ARGUMENTS};
|
||||
}
|
||||
@ -302,6 +303,12 @@ std::vector<DictionaryAttribute> DictionaryStructure::getAttributes(
|
||||
checkAttributeKeys(attribute_keys);
|
||||
|
||||
const auto name = config.getString(prefix + "name");
|
||||
|
||||
/// Don't include range_min and range_max in attributes list, otherwise
|
||||
/// columns will be duplicated
|
||||
if ((range_min && name == range_min->name) || (range_max && name == range_max->name))
|
||||
continue;
|
||||
|
||||
const auto type_string = config.getString(prefix + "type");
|
||||
const auto type = DataTypeFactory::instance().get(type_string);
|
||||
const auto underlying_type = getAttributeUnderlyingType(type_string);
|
||||
|
@ -113,6 +113,7 @@ struct DictionaryStructure final
|
||||
size_t getKeySize() const;
|
||||
|
||||
private:
|
||||
/// range_min and range_max have to be parsed before this function call
|
||||
std::vector<DictionaryAttribute> getAttributes(
|
||||
const Poco::Util::AbstractConfiguration & config,
|
||||
const std::string & config_prefix,
|
||||
|
@ -111,3 +111,5 @@ target_link_libraries(clickhouse_functions PRIVATE clickhouse_functions_url)
|
||||
|
||||
add_subdirectory(array)
|
||||
target_link_libraries(clickhouse_functions PRIVATE clickhouse_functions_array)
|
||||
|
||||
target_link_libraries(clickhouse_functions PRIVATE stats)
|
||||
|
307
src/Functions/abtesting.cpp
Normal file
307
src/Functions/abtesting.cpp
Normal file
@ -0,0 +1,307 @@
|
||||
#if !defined(ARCADIA_BUILD)
|
||||
|
||||
#include <math.h>
|
||||
#include <sstream>
|
||||
|
||||
#include <DataTypes/DataTypeString.h>
|
||||
#include <Columns/ColumnString.h>
|
||||
#include <Columns/ColumnConst.h>
|
||||
#include <Columns/ColumnsNumber.h>
|
||||
#include <Functions/FunctionFactory.h>
|
||||
#include <Functions/FunctionHelpers.h>
|
||||
#include <Functions/abtesting.h>
|
||||
#include <IO/WriteHelpers.h>
|
||||
#include <IO/WriteBufferFromOStream.h>
|
||||
|
||||
#define STATS_ENABLE_STDVEC_WRAPPERS
|
||||
#include <stats.hpp>
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
namespace ErrorCodes
|
||||
{
|
||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||
extern const int BAD_ARGUMENTS;
|
||||
}
|
||||
|
||||
static const String BETA = "beta";
|
||||
static const String GAMMA = "gamma";
|
||||
|
||||
template <bool higher_is_better>
|
||||
Variants bayesian_ab_test(String distribution, PODArray<Float64> & xs, PODArray<Float64> & ys)
|
||||
{
|
||||
const size_t r = 1000, c = 100;
|
||||
|
||||
Variants variants(xs.size(), {0.0, 0.0, 0.0, 0.0});
|
||||
std::vector<std::vector<Float64>> samples_matrix;
|
||||
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
{
|
||||
variants[i].x = xs[i];
|
||||
variants[i].y = ys[i];
|
||||
}
|
||||
|
||||
if (distribution == BETA)
|
||||
{
|
||||
Float64 alpha, beta;
|
||||
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
if (xs[i] < ys[i])
|
||||
throw Exception("Conversions cannot be larger than trials", ErrorCodes::BAD_ARGUMENTS);
|
||||
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
{
|
||||
alpha = 1.0 + ys[i];
|
||||
beta = 1.0 + xs[i] - ys[i];
|
||||
|
||||
samples_matrix.emplace_back(stats::rbeta<std::vector<Float64>>(r, c, alpha, beta));
|
||||
}
|
||||
}
|
||||
else if (distribution == GAMMA)
|
||||
{
|
||||
Float64 shape, scale;
|
||||
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
{
|
||||
shape = 1.0 + xs[i];
|
||||
scale = 250.0 / (1 + 250.0 * ys[i]);
|
||||
|
||||
std::vector<Float64> samples = stats::rgamma<std::vector<Float64>>(r, c, shape, scale);
|
||||
for (auto & sample : samples)
|
||||
sample = 1 / sample;
|
||||
samples_matrix.emplace_back(std::move(samples));
|
||||
}
|
||||
}
|
||||
|
||||
PODArray<Float64> means;
|
||||
for (auto & samples : samples_matrix)
|
||||
{
|
||||
Float64 total = 0.0;
|
||||
for (auto sample : samples)
|
||||
total += sample;
|
||||
means.push_back(total / samples.size());
|
||||
}
|
||||
|
||||
// Beats control
|
||||
for (size_t i = 1; i < xs.size(); ++i)
|
||||
{
|
||||
for (size_t n = 0; n < r * c; ++n)
|
||||
{
|
||||
if (higher_is_better)
|
||||
{
|
||||
if (samples_matrix[i][n] > samples_matrix[0][n])
|
||||
++variants[i].beats_control;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (samples_matrix[i][n] < samples_matrix[0][n])
|
||||
++variants[i].beats_control;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto & variant : variants)
|
||||
variant.beats_control = static_cast<Float64>(variant.beats_control) / r / c;
|
||||
|
||||
// To be best
|
||||
PODArray<size_t> count_m(xs.size(), 0);
|
||||
PODArray<Float64> row(xs.size(), 0);
|
||||
|
||||
for (size_t n = 0; n < r * c; ++n)
|
||||
{
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
row[i] = samples_matrix[i][n];
|
||||
|
||||
Float64 m;
|
||||
if (higher_is_better)
|
||||
m = *std::max_element(row.begin(), row.end());
|
||||
else
|
||||
m = *std::min_element(row.begin(), row.end());
|
||||
|
||||
for (size_t i = 0; i < xs.size(); ++i)
|
||||
{
|
||||
if (m == samples_matrix[i][n])
|
||||
{
|
||||
++variants[i].best;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (auto & variant : variants)
|
||||
variant.best = static_cast<Float64>(variant.best) / r / c;
|
||||
|
||||
return variants;
|
||||
}
|
||||
|
||||
String convertToJson(const PODArray<String> & variant_names, const Variants & variants)
|
||||
{
|
||||
FormatSettings settings;
|
||||
std::stringstream s;
|
||||
|
||||
{
|
||||
WriteBufferFromOStream buf(s);
|
||||
|
||||
writeCString("{\"data\":[", buf);
|
||||
for (size_t i = 0; i < variants.size(); ++i)
|
||||
{
|
||||
writeCString("{\"variant_name\":", buf);
|
||||
writeJSONString(variant_names[i], buf, settings);
|
||||
writeCString(",\"x\":", buf);
|
||||
writeText(variants[i].x, buf);
|
||||
writeCString(",\"y\":", buf);
|
||||
writeText(variants[i].y, buf);
|
||||
writeCString(",\"beats_control\":", buf);
|
||||
writeText(variants[i].beats_control, buf);
|
||||
writeCString(",\"to_be_best\":", buf);
|
||||
writeText(variants[i].best, buf);
|
||||
writeCString("}", buf);
|
||||
if (i != variant_names.size() -1) writeCString(",", buf);
|
||||
}
|
||||
writeCString("]}", buf);
|
||||
}
|
||||
|
||||
return s.str();
|
||||
}
|
||||
|
||||
class FunctionBayesAB : public IFunction
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "bayesAB";
|
||||
|
||||
static FunctionPtr create(const Context &)
|
||||
{
|
||||
return std::make_shared<FunctionBayesAB>();
|
||||
}
|
||||
|
||||
String getName() const override
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
bool isDeterministic() const override { return false; }
|
||||
bool isDeterministicInScopeOfQuery() const override { return false; }
|
||||
|
||||
size_t getNumberOfArguments() const override { return 5; }
|
||||
|
||||
DataTypePtr getReturnTypeImpl(const DataTypes &) const override
|
||||
{
|
||||
return std::make_shared<DataTypeString>();
|
||||
}
|
||||
|
||||
static bool toFloat64(const ColumnConst * col_const_arr, PODArray<Float64> & output)
|
||||
{
|
||||
Array src_arr = col_const_arr->getValue<Array>();
|
||||
|
||||
for (size_t i = 0, size = src_arr.size(); i < size; ++i)
|
||||
{
|
||||
switch (src_arr[i].getType())
|
||||
{
|
||||
case Field::Types::Int64:
|
||||
output.push_back(static_cast<Float64>(src_arr[i].get<const Int64 &>()));
|
||||
break;
|
||||
case Field::Types::UInt64:
|
||||
output.push_back(static_cast<Float64>(src_arr[i].get<const UInt64 &>()));
|
||||
break;
|
||||
case Field::Types::Float64:
|
||||
output.push_back(src_arr[i].get<const Float64 &>());
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) const override
|
||||
{
|
||||
if (input_rows_count == 0)
|
||||
{
|
||||
block.getByPosition(result).column = ColumnString::create();
|
||||
return;
|
||||
}
|
||||
|
||||
PODArray<Float64> xs, ys;
|
||||
PODArray<String> variant_names;
|
||||
String dist;
|
||||
bool higher_is_better;
|
||||
|
||||
if (const ColumnConst * col_dist = checkAndGetColumnConst<ColumnString>(block.getByPosition(arguments[0]).column.get()))
|
||||
{
|
||||
dist = col_dist->getDataAt(0).data;
|
||||
dist = Poco::toLower(dist);
|
||||
if (dist != BETA && dist != GAMMA)
|
||||
throw Exception("First argument for function " + getName() + " cannot be " + dist, ErrorCodes::BAD_ARGUMENTS);
|
||||
}
|
||||
else
|
||||
throw Exception("First argument for function " + getName() + " must be Constant string", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
if (const ColumnConst * col_higher_is_better = checkAndGetColumnConst<ColumnUInt8>(block.getByPosition(arguments[1]).column.get()))
|
||||
higher_is_better = col_higher_is_better->getBool(0);
|
||||
else
|
||||
throw Exception("Second argument for function " + getName() + " must be Constatnt boolean", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
if (const ColumnConst * col_const_arr = checkAndGetColumnConst<ColumnArray>(block.getByPosition(arguments[2]).column.get()))
|
||||
{
|
||||
if (!col_const_arr)
|
||||
throw Exception("Thrid argument for function " + getName() + " must be Array of constant strings", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
|
||||
Array src_arr = col_const_arr->getValue<Array>();
|
||||
|
||||
for (size_t i = 0; i < src_arr.size(); ++i)
|
||||
{
|
||||
if (src_arr[i].getType() != Field::Types::String)
|
||||
throw Exception("Thrid argument for function " + getName() + " must be Array of constant strings", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
variant_names.push_back(src_arr[i].get<const String &>());
|
||||
}
|
||||
}
|
||||
|
||||
if (const ColumnConst * col_const_arr = checkAndGetColumnConst<ColumnArray>(block.getByPosition(arguments[3]).column.get()))
|
||||
{
|
||||
if (!col_const_arr)
|
||||
throw Exception("Forth argument for function " + getName() + " must be Array of constant numbers", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
if (!toFloat64(col_const_arr, xs))
|
||||
throw Exception("Forth and fifth Argument for function " + getName() + " must be Array of constant Numbers", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
|
||||
if (const ColumnConst * col_const_arr = checkAndGetColumnConst<ColumnArray>(block.getByPosition(arguments[4]).column.get()))
|
||||
{
|
||||
if (!col_const_arr)
|
||||
throw Exception("Fifth argument for function " + getName() + " must be Array of constant numbers", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
if (!toFloat64(col_const_arr, ys))
|
||||
throw Exception("Fifth Argument for function " + getName() + " must be Array of constant Numbers", ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT);
|
||||
}
|
||||
|
||||
if (variant_names.size() != xs.size() || xs.size() != ys.size())
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Sizes of arguments doen't match: variant_names: {}, xs: {}, ys: {}", variant_names.size(), xs.size(), ys.size());
|
||||
|
||||
if (variant_names.size() < 2)
|
||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Sizes of arguments must be larger than 1. variant_names: {}, xs: {}, ys: {}", variant_names.size(), xs.size(), ys.size());
|
||||
|
||||
if (std::count_if(xs.begin(), xs.end(), [](Float64 v) { return v < 0; }) > 0 ||
|
||||
std::count_if(ys.begin(), ys.end(), [](Float64 v) { return v < 0; }) > 0)
|
||||
throw Exception("Negative values don't allowed", ErrorCodes::BAD_ARGUMENTS);
|
||||
|
||||
Variants variants;
|
||||
if (higher_is_better)
|
||||
variants = bayesian_ab_test<true>(dist, xs, ys);
|
||||
else
|
||||
variants = bayesian_ab_test<false>(dist, xs, ys);
|
||||
|
||||
auto dst = ColumnString::create();
|
||||
std::string result_str = convertToJson(variant_names, variants);
|
||||
dst->insertData(result_str.c_str(), result_str.length());
|
||||
block.getByPosition(result).column = std::move(dst);
|
||||
}
|
||||
};
|
||||
|
||||
void registerFunctionBayesAB(FunctionFactory & factory)
|
||||
{
|
||||
factory.registerFunction<FunctionBayesAB>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#endif
|
31
src/Functions/abtesting.h
Normal file
31
src/Functions/abtesting.h
Normal file
@ -0,0 +1,31 @@
|
||||
#if !defined(ARCADIA_BUILD)
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include <Core/Types.h>
|
||||
#include <Common/PODArray.h>
|
||||
|
||||
|
||||
namespace DB
|
||||
{
|
||||
|
||||
typedef struct _Variant
|
||||
{
|
||||
Float64 x;
|
||||
Float64 y;
|
||||
Float64 beats_control;
|
||||
Float64 best;
|
||||
} Variant;
|
||||
|
||||
using Variants = PODArray<Variant>;
|
||||
|
||||
template <bool higher_is_better>
|
||||
Variants bayesian_ab_test(String distribution, PODArray<Float64> & xs, PODArray<Float64> & ys);
|
||||
|
||||
String convertToJson(const PODArray<String> & variant_names, const Variants & variants);
|
||||
|
||||
}
|
||||
#endif
|
@ -38,6 +38,9 @@ void registerFunctionsNull(FunctionFactory &);
|
||||
void registerFunctionsJSON(FunctionFactory &);
|
||||
void registerFunctionsConsistentHashing(FunctionFactory & factory);
|
||||
void registerFunctionsUnixTimestamp64(FunctionFactory & factory);
|
||||
#if !defined(ARCADIA_BUILD)
|
||||
void registerFunctionBayesAB(FunctionFactory &);
|
||||
#endif
|
||||
|
||||
|
||||
void registerFunctions()
|
||||
@ -80,6 +83,9 @@ void registerFunctions()
|
||||
registerFunctionsIntrospection(factory);
|
||||
registerFunctionsConsistentHashing(factory);
|
||||
registerFunctionsUnixTimestamp64(factory);
|
||||
#if !defined(ARCADIA_BUILD)
|
||||
registerFunctionBayesAB(factory);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,2 +1,4 @@
|
||||
add_executable (number_traits number_traits.cpp)
|
||||
add_executable (abtesting abtesting.cpp)
|
||||
target_link_libraries (number_traits PRIVATE dbms)
|
||||
target_link_libraries (abtesting PRIVATE clickhouse_functions)
|
||||
|
94
src/Functions/tests/abtesting.cpp
Normal file
94
src/Functions/tests/abtesting.cpp
Normal file
@ -0,0 +1,94 @@
|
||||
#include <Functions/abtesting.h>
|
||||
#include <iostream>
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace DB;
|
||||
|
||||
Variants test_bayesab(std::string dist, PODArray<Float64> xs, PODArray<Float64> ys, size_t & max, size_t & min)
|
||||
{
|
||||
Variants variants;
|
||||
|
||||
std::cout << std::fixed;
|
||||
if (dist == "beta")
|
||||
{
|
||||
std::cout << dist << "\nclicks: ";
|
||||
for (auto x : xs) std::cout << x << " ";
|
||||
|
||||
std::cout <<"\tconversions: ";
|
||||
for (auto y : ys) std::cout << y << " ";
|
||||
|
||||
std::cout << "\n";
|
||||
|
||||
variants = bayesian_ab_test<true>(dist, xs, ys);
|
||||
}
|
||||
else if (dist == "gamma")
|
||||
{
|
||||
std::cout << dist << "\nclicks: ";
|
||||
for (auto x : xs) std::cout << x << " ";
|
||||
|
||||
std::cout <<"\tcost: ";
|
||||
for (auto y : ys) std::cout << y << " ";
|
||||
|
||||
std::cout << "\n";
|
||||
variants = bayesian_ab_test<true>(dist, xs, ys);
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < variants.size(); ++i)
|
||||
std::cout << i << " beats 0: " << variants[i].beats_control << std::endl;
|
||||
|
||||
for (size_t i = 0; i < variants.size(); ++i)
|
||||
std::cout << i << " to be best: " << variants[i].best << std::endl;
|
||||
|
||||
std::cout << convertToJson({"0", "1", "2"}, variants) << std::endl;
|
||||
|
||||
Float64 max_val = 0.0, min_val = 2.0;
|
||||
for (size_t i = 0; i < variants.size(); ++i)
|
||||
{
|
||||
if (variants[i].best > max_val)
|
||||
{
|
||||
max_val = variants[i].best;
|
||||
max = i;
|
||||
}
|
||||
|
||||
if (variants[i].best < min_val)
|
||||
{
|
||||
min_val = variants[i].best;
|
||||
min = i;
|
||||
}
|
||||
}
|
||||
|
||||
return variants;
|
||||
}
|
||||
|
||||
|
||||
int main(int, char **)
|
||||
{
|
||||
size_t max, min;
|
||||
|
||||
auto variants = test_bayesab("beta", {10000, 1000, 900}, {600, 110, 90}, max, min);
|
||||
if (max != 1) exit(1);
|
||||
|
||||
variants = test_bayesab("beta", {3000, 3000, 3000}, {600, 100, 90}, max, min);
|
||||
if (max != 0) exit(1);
|
||||
|
||||
variants = test_bayesab("beta", {3000, 3000, 3000}, {100, 90, 110}, max, min);
|
||||
if (max != 2) exit(1);
|
||||
|
||||
variants = test_bayesab("beta", {3000, 3000, 3000}, {110, 90, 100}, max, min);
|
||||
if (max != 0) exit(1);
|
||||
|
||||
variants = test_bayesab("gamma", {10000, 1000, 900}, {600, 110, 90}, max, min);
|
||||
if (max != 1) exit(1);
|
||||
|
||||
variants = test_bayesab("gamma", {3000, 3000, 3000}, {600, 100, 90}, max, min);
|
||||
if (max != 0) exit(1);
|
||||
|
||||
variants = test_bayesab("gamma", {3000, 3000, 3000}, {100, 90, 110}, max, min);
|
||||
if (max != 2) exit(1);
|
||||
|
||||
variants = test_bayesab("gamma", {3000, 3000, 3000}, {110, 90, 100}, max, min);
|
||||
if (max != 0) exit(1);
|
||||
|
||||
std::cout << "Successfully done\n";
|
||||
return 0;
|
||||
}
|
@ -32,7 +32,7 @@ PEERDIR(
|
||||
|
||||
# "Arcadia" build is slightly deficient. It lacks many libraries that we need.
|
||||
SRCS(
|
||||
<? find . -name '*.cpp' | grep -i -v -P 'tests|Bitmap|sumbur' | sed 's/^\.\// /' | sort ?>
|
||||
<? find . -name '*.cpp' | grep -i -v -P 'tests|Bitmap|sumbur|abtesting' | sed 's/^\.\// /' | sort ?>
|
||||
)
|
||||
|
||||
END()
|
||||
|
@ -114,9 +114,6 @@ ReadFromStorageStep::ReadFromStorageStep(
|
||||
}
|
||||
}
|
||||
|
||||
if (pipes.size() == 1 && !storage->isView())
|
||||
pipeline->setMaxThreads(1);
|
||||
|
||||
for (auto & pipe : pipes)
|
||||
pipe.enableQuota();
|
||||
|
||||
|
@ -35,7 +35,7 @@ public:
|
||||
void readSuffixImpl() override;
|
||||
|
||||
void commit();
|
||||
bool isStalled() const { return buffer->isStalled(); }
|
||||
bool isStalled() const { return !buffer || buffer->isStalled(); }
|
||||
|
||||
private:
|
||||
StorageKafka & storage;
|
||||
|
42
tests/integration/test_range_hashed_dictionary_types/test.py
Normal file
42
tests/integration/test_range_hashed_dictionary_types/test.py
Normal file
@ -0,0 +1,42 @@
|
||||
import pytest
|
||||
|
||||
|
||||
from helpers.cluster import ClickHouseCluster
|
||||
cluster = ClickHouseCluster(__file__)
|
||||
|
||||
node1 = cluster.add_instance('node1')
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def started_cluster():
|
||||
try:
|
||||
cluster.start()
|
||||
yield cluster
|
||||
finally:
|
||||
cluster.shutdown()
|
||||
|
||||
|
||||
def test_range_hashed_dict(started_cluster):
|
||||
script = "echo '4990954156238030839\t2018-12-31 21:00:00\t2020-12-30 20:59:59\t0.1\tRU' > /var/lib/clickhouse/user_files/rates.tsv"
|
||||
node1.exec_in_container(["bash", "-c", script])
|
||||
node1.query("""
|
||||
CREATE DICTIONARY rates
|
||||
(
|
||||
hash_id UInt64,
|
||||
start_date DateTime default '0000-00-00 00:00:00',
|
||||
end_date DateTime default '0000-00-00 00:00:00',
|
||||
price Float64,
|
||||
currency String
|
||||
)
|
||||
PRIMARY KEY hash_id
|
||||
SOURCE(file(
|
||||
path '/var/lib/clickhouse/user_files/rates.tsv'
|
||||
format 'TSV'
|
||||
))
|
||||
LAYOUT(RANGE_HASHED())
|
||||
RANGE(MIN start_date MAX end_date)
|
||||
LIFETIME(60);
|
||||
""")
|
||||
node1.query("SYSTEM RELOAD DICTIONARY default.rates")
|
||||
|
||||
assert node1.query("SELECT dictGetString('default.rates', 'currency', toUInt64(4990954156238030839), toDateTime('2019-10-01 00:00:00'))") == "RU\n"
|
@ -2075,6 +2075,47 @@ def test_premature_flush_on_eof(kafka_cluster):
|
||||
DROP TABLE test.destination;
|
||||
''')
|
||||
|
||||
|
||||
@pytest.mark.timeout(180)
|
||||
def test_kafka_unavailable(kafka_cluster):
|
||||
messages = [json.dumps({'key': j+1, 'value': j+1}) for j in range(20000)]
|
||||
kafka_produce('test_bad_reschedule', messages)
|
||||
|
||||
kafka_cluster.pause_container('kafka1')
|
||||
|
||||
instance.query('''
|
||||
CREATE TABLE test.kafka (key UInt64, value UInt64)
|
||||
ENGINE = Kafka
|
||||
SETTINGS kafka_broker_list = 'kafka1:19092',
|
||||
kafka_topic_list = 'test_bad_reschedule',
|
||||
kafka_group_name = 'test_bad_reschedule',
|
||||
kafka_format = 'JSONEachRow',
|
||||
kafka_max_block_size = 1000;
|
||||
|
||||
CREATE MATERIALIZED VIEW test.destination Engine=Log AS
|
||||
SELECT
|
||||
key,
|
||||
now() as consume_ts,
|
||||
value,
|
||||
_topic,
|
||||
_key,
|
||||
_offset,
|
||||
_partition,
|
||||
_timestamp
|
||||
FROM test.kafka;
|
||||
''')
|
||||
|
||||
instance.query("SELECT * FROM test.kafka")
|
||||
instance.query("SELECT count() FROM test.destination")
|
||||
|
||||
# enough to trigger issue
|
||||
time.sleep(30)
|
||||
kafka_cluster.unpause_container('kafka1')
|
||||
|
||||
while int(instance.query("SELECT count() FROM test.destination")) < 20000:
|
||||
print("Waiting for consume")
|
||||
time.sleep(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
cluster.start()
|
||||
raw_input("Cluster created, press any key to destroy...")
|
||||
|
3
tests/performance/local_replica.xml
Normal file
3
tests/performance/local_replica.xml
Normal file
@ -0,0 +1,3 @@
|
||||
<test>
|
||||
<query>select sum(number) from remote('127.0.0.{{1|2}}', numbers_mt(1000000000)) group by bitAnd(number, 1)</query>
|
||||
</test>
|
@ -39,7 +39,7 @@ SimpleAggregateFunction(sum, Float64)
|
||||
7 14
|
||||
8 16
|
||||
9 18
|
||||
1 1 2 2.2.2.2 3 ([1,2,3],[2,1,1]) [1,2,2,3,4] [4,2,1,3]
|
||||
10 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 20 20.20.20.20 5 ([2,3,4],[2,1,1]) [] []
|
||||
SimpleAggregateFunction(anyLast, Nullable(String)) SimpleAggregateFunction(anyLast, LowCardinality(Nullable(String))) SimpleAggregateFunction(anyLast, IPv4) SimpleAggregateFunction(groupBitOr, UInt32) SimpleAggregateFunction(sumMap, Tuple(Array(Int32), Array(Int64))) SimpleAggregateFunction(groupArrayArray, Array(Int32)) SimpleAggregateFunction(groupUniqArrayArray, Array(Int32))
|
||||
1 1 2 2.2.2.2 3 ([1,2,3],[2,1,1]) ([1,2,3],[1,1,2]) ([1,2,3],[2,1,2]) [1,2,2,3,4] [4,2,1,3]
|
||||
10 2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 20 20.20.20.20 5 ([2,3,4],[2,1,1]) ([2,3,4],[3,3,4]) ([2,3,4],[4,3,4]) [] []
|
||||
SimpleAggregateFunction(anyLast, Nullable(String)) SimpleAggregateFunction(anyLast, LowCardinality(Nullable(String))) SimpleAggregateFunction(anyLast, IPv4) SimpleAggregateFunction(groupBitOr, UInt32) SimpleAggregateFunction(sumMap, Tuple(Array(Int32), Array(Int64))) SimpleAggregateFunction(minMap, Tuple(Array(Int32), Array(Int64))) SimpleAggregateFunction(maxMap, Tuple(Array(Int32), Array(Int64))) SimpleAggregateFunction(groupArrayArray, Array(Int32)) SimpleAggregateFunction(groupUniqArrayArray, Array(Int32))
|
||||
with_overflow 1 0
|
||||
|
@ -28,22 +28,25 @@ create table simple (
|
||||
ip SimpleAggregateFunction(anyLast,IPv4),
|
||||
status SimpleAggregateFunction(groupBitOr, UInt32),
|
||||
tup SimpleAggregateFunction(sumMap, Tuple(Array(Int32), Array(Int64))),
|
||||
tup_min SimpleAggregateFunction(minMap, Tuple(Array(Int32), Array(Int64))),
|
||||
tup_max SimpleAggregateFunction(maxMap, Tuple(Array(Int32), Array(Int64))),
|
||||
arr SimpleAggregateFunction(groupArrayArray, Array(Int32)),
|
||||
uniq_arr SimpleAggregateFunction(groupUniqArrayArray, Array(Int32))
|
||||
) engine=AggregatingMergeTree order by id;
|
||||
insert into simple values(1,'1','1','1.1.1.1', 1, ([1,2], [1,1]), [1,2], [1,2]);
|
||||
insert into simple values(1,null,'2','2.2.2.2', 2, ([1,3], [1,1]), [2,3,4], [2,3,4]);
|
||||
insert into simple values(1,'1','1','1.1.1.1', 1, ([1,2], [1,1]), ([1,2], [1,1]), ([1,2], [1,1]), [1,2], [1,2]);
|
||||
insert into simple values(1,null,'2','2.2.2.2', 2, ([1,3], [1,1]), ([1,3], [2,2]), ([1,3], [2,2]), [2,3,4], [2,3,4]);
|
||||
-- String longer then MAX_SMALL_STRING_SIZE (actual string length is 100)
|
||||
insert into simple values(10,'10','10','10.10.10.10', 4, ([2,3], [1,1]), [], []);
|
||||
insert into simple values(10,'2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222','20','20.20.20.20', 1, ([2, 4], [1,1]), [], []);
|
||||
insert into simple values(10,'10','10','10.10.10.10', 4, ([2,3], [1,1]), ([2,3], [3,3]), ([2,3], [3,3]), [], []);
|
||||
insert into simple values(10,'2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222','20','20.20.20.20', 1, ([2, 4], [1,1]), ([2, 4], [4,4]), ([2, 4], [4,4]), [], []);
|
||||
|
||||
select * from simple final order by id;
|
||||
select toTypeName(nullable_str),toTypeName(low_str),toTypeName(ip),toTypeName(status), toTypeName(tup), toTypeName(arr), toTypeName(uniq_arr) from simple limit 1;
|
||||
select toTypeName(nullable_str),toTypeName(low_str),toTypeName(ip),toTypeName(status), toTypeName(tup), toTypeName(tup_min), toTypeName(tup_max), toTypeName(arr), toTypeName(uniq_arr) from simple limit 1;
|
||||
|
||||
optimize table simple final;
|
||||
|
||||
drop table simple;
|
||||
|
||||
drop table if exists with_overflow;
|
||||
create table with_overflow (
|
||||
id UInt64,
|
||||
s SimpleAggregateFunction(sumWithOverflow, UInt8)
|
||||
@ -54,4 +57,4 @@ insert into with_overflow select 1, 1 from numbers(256);
|
||||
optimize table with_overflow final;
|
||||
|
||||
select 'with_overflow', * from with_overflow;
|
||||
|
||||
drop table with_overflow;
|
||||
|
@ -0,0 +1,4 @@
|
||||
1
|
||||
1
|
||||
1
|
||||
1
|
4
tests/queries/0_stateless/01411_bayesian_ab_testing.sql
Normal file
4
tests/queries/0_stateless/01411_bayesian_ab_testing.sql
Normal file
@ -0,0 +1,4 @@
|
||||
SELECT count() FROM (SELECT bayesAB('beta', 1, ['Control', 'A', 'B'], [3000.0, 3000.0, 2000.0], [1000.0, 1100.0, 800.0]));
|
||||
SELECT count() FROM (SELECT bayesAB('gamma', 1, ['Control', 'A', 'B'], [3000.0, 3000.0, 2000.0], [1000.0, 1100.0, 800.0]));
|
||||
SELECT count() FROM (SELECT bayesAB('beta', 0, ['Control', 'A', 'B'], [3000.0, 3000.0, 2000.0], [1000.0, 1100.0, 800.0]));
|
||||
SELECT count() FROM (SELECT bayesAB('gamma', 0, ['Control', 'A', 'B'], [3000.0, 3000.0, 2000.0], [1000.0, 1100.0, 800.0]));
|
@ -0,0 +1,3 @@
|
||||
249999500000
|
||||
250000000000
|
||||
1
|
@ -0,0 +1,7 @@
|
||||
set log_queries = 1;
|
||||
set max_threads = 16;
|
||||
|
||||
select sum(number) from remote('127.0.0.{1|2}', numbers_mt(1000000)) group by number % 2 order by number % 2;
|
||||
|
||||
system flush logs;
|
||||
select length(thread_ids) >= 16 from system.query_log where event_date >= today() - 1 and lower(query) like '%select sum(number) from remote(_127.0.0.{1|2}_, numbers_mt(1000000)) group by number %' and type = 'QueryFinish' order by query_start_time desc limit 1;
|
@ -0,0 +1,2 @@
|
||||
1000
|
||||
1000
|
22
tests/queries/0_stateless/01416_clear_column_pk.sql
Normal file
22
tests/queries/0_stateless/01416_clear_column_pk.sql
Normal file
@ -0,0 +1,22 @@
|
||||
DROP TABLE IF EXISTS table_with_pk_clear;
|
||||
|
||||
CREATE TABLE table_with_pk_clear(
|
||||
key1 UInt64,
|
||||
key2 String,
|
||||
value1 String,
|
||||
value2 String
|
||||
)
|
||||
ENGINE = MergeTree()
|
||||
ORDER by (key1, key2);
|
||||
|
||||
INSERT INTO table_with_pk_clear SELECT number, number * number, toString(number), toString(number * number) FROM numbers(1000);
|
||||
|
||||
ALTER TABLE table_with_pk_clear CLEAR COLUMN key1 IN PARTITION tuple(); --{serverError 524}
|
||||
|
||||
SELECT count(distinct key1) FROM table_with_pk_clear;
|
||||
|
||||
ALTER TABLE table_with_pk_clear CLEAR COLUMN key2 IN PARTITION tuple(); --{serverError 524}
|
||||
|
||||
SELECT count(distinct key2) FROM table_with_pk_clear;
|
||||
|
||||
DROP TABLE IF EXISTS table_with_pk_clear;
|
@ -133,3 +133,4 @@
|
||||
01376_GROUP_BY_injective_elimination_dictGet
|
||||
01391_join_on_dict_crash
|
||||
01401_FORMAT_SETTINGS
|
||||
01411_bayesian_ab_testing
|
||||
|
Loading…
Reference in New Issue
Block a user