Para obtener información sobre cómo crear listas de referencia, consulte la sección "Diccionarios".
Múltiples geobases
ClickHouse permite trabajar simultáneamente con múltiples geobases alternativas (jerarquías regionales) para admitir distintas perspectivas sobre a qué países pertenecen ciertas regiones.
La configuración de clickhouse-server especifica el archivo con la jerarquía regional:
<path_to_regions_hierarchy_file>/opt/geo/regions_hierarchy.txt</path_to_regions_hierarchy_file>
Además de este archivo, también busca archivos cercanos que tengan el símbolo _ y cualquier sufijo añadido al nombre (antes de la extensión del archivo).
Por ejemplo, también encontrará el archivo /opt/geo/regions_hierarchy_ua.txt, si existe. Aquí, ua se denomina la clave del diccionario. En el caso de un diccionario sin sufijo, la clave es una cadena vacía.
Todos los diccionarios se recargan durante el tiempo de ejecución (cada cierto número de segundos, según se define en el parámetro de configuración builtin_dictionaries_reload_interval, o una vez por hora de forma predeterminada). Sin embargo, la lista de diccionarios disponibles se define una sola vez, cuando se inicia el servidor.
Todas las funciones para trabajar con regiones tienen un argumento opcional al final: la clave del diccionario. A esto se le llama la geobase.
Ejemplo:
regionToCountry(RegionID) –regionToName
Acepta un ID de región y geobase, y devuelve una cadena con el nombre de la región en el idioma correspondiente. Si no existe una región con el ID especificado, se devuelve una cadena vacía.
Sintaxis
regionToName(id\Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- Nombre de la región en el idioma correspondiente indicado por
geobase. String. - De lo contrario, una cadena vacía.
Ejemplo
SELECT regionToName(number::UInt32,'en') FROM numbers(0,5);┌─regionToName(CAST(number, 'UInt32'), 'en')─┐
│ │
│ World │
│ USA │
│ Colorado │
│ Boulder County │
└────────────────────────────────────────────┘regionToCity
Acepta un ID de región de la geobase. Si esta región es una ciudad o parte de una ciudad, devuelve el ID de región de la ciudad correspondiente. En caso contrario, devuelve 0.
Sintaxis
regionToCity(id [, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- ID de la región de la ciudad correspondiente, si existe. UInt32.
- 0, si no existe.
Ejemplo
SELECT regionToName(number::UInt32, 'en'), regionToCity(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13);┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToCity(CAST(number, 'UInt32')), 'en')─┐
│ │ 0 │ │
│ World │ 0 │ │
│ USA │ 0 │ │
│ Colorado │ 0 │ │
│ Boulder County │ 0 │ │
│ Boulder │ 5 │ Boulder │
│ China │ 0 │ │
│ Sichuan │ 0 │ │
│ Chengdu │ 8 │ Chengdu │
│ America │ 0 │ │
│ North America │ 0 │ │
│ Eurasia │ 0 │ │
│ Asia │ 0 │ │
└────────────────────────────────────────────┴────┴──────────────────────────────────────────────────────────┘regionToArea
Convierte una región en un área (tipo 5 en la geobase). En todos los demás aspectos, esta función es igual que 'regionToCity'.
Sintaxis
regionToArea(id [, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- ID de la región del área correspondiente, si existe. UInt32.
- 0 si no existe.
Ejemplo
SELECT DISTINCT regionToName(regionToArea(toUInt32(number), 'ua'))
FROM system.numbers
LIMIT 15┌─regionToName(regionToArea(toUInt32(number), \'ua\'))─┐
│ │
│ Moscow and Moscow region │
│ St. Petersburg and Leningrad region │
│ Belgorod region │
│ Ivanovsk region │
│ Kaluga region │
│ Kostroma region │
│ Kursk region │
│ Lipetsk region │
│ Orlov region │
│ Ryazan region │
│ Smolensk region │
│ Tambov region │
│ Tver region │
│ Tula region │
└──────────────────────────────────────────────────────┘regionToDistrict
Convierte una región en un distrito federal (tipo 4 en la geobase). Por lo demás, esta función es igual que 'regionToCity'.
Sintaxis
regionToDistrict(id [, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulta Múltiples geobases. String. Opcional.
Valor devuelto
- ID de la región de la ciudad correspondiente, si existe. UInt32.
- 0, si no existe ninguna.
Ejemplo
SELECT DISTINCT regionToName(regionToDistrict(toUInt32(number), 'ua'))
FROM system.numbers
LIMIT 15┌─regionToName(regionToDistrict(toUInt32(number), \'ua\'))─┐
│ │
│ Central federal district │
│ Northwest federal district │
│ South federal district │
│ North Caucases federal district │
│ Privolga federal district │
│ Ural federal district │
│ Siberian federal district │
│ Far East federal district │
│ Scotland │
│ Faroe Islands │
│ Flemish region │
│ Brussels capital region │
│ Wallonia │
│ Federation of Bosnia and Herzegovina │
└──────────────────────────────────────────────────────────┘regionToCountry
Convierte una región en un país (tipo 3 de la geobase). Por lo demás, esta función es igual que 'regionToCity'.
Sintaxis
regionToCountry(id [, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- ID de la región del país correspondiente, si existe. UInt32.
- 0, si no existe.
Ejemplo
SELECT regionToName(number::UInt32, 'en'), regionToCountry(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13);┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToCountry(CAST(number, 'UInt32')), 'en')─┐
│ │ 0 │ │
│ World │ 0 │ │
│ USA │ 2 │ USA │
│ Colorado │ 2 │ USA │
│ Boulder County │ 2 │ USA │
│ Boulder │ 2 │ USA │
│ China │ 6 │ China │
│ Sichuan │ 6 │ China │
│ Chengdu │ 6 │ China │
│ America │ 0 │ │
│ North America │ 0 │ │
│ Eurasia │ 0 │ │
│ Asia │ 0 │ │
└────────────────────────────────────────────┴────┴─────────────────────────────────────────────────────────────┘regionToContinent
Convierte una región en un continente (tipo 1 de la geobase). En todo lo demás, esta función es igual que 'regionToCity'.
Sintaxis
regionToContinent(id [, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Véase Múltiples geobases. String. Opcional.
Valor devuelto
- ID de la región del continente correspondiente, si existe. UInt32.
- 0, si no existe.
Ejemplo
SELECT regionToName(number::UInt32, 'en'), regionToContinent(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13);┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToContinent(CAST(number, 'UInt32')), 'en')─┐
│ │ 0 │ │
│ World │ 0 │ │
│ USA │ 10 │ North America │
│ Colorado │ 10 │ North America │
│ Boulder County │ 10 │ North America │
│ Boulder │ 10 │ North America │
│ China │ 12 │ Asia │
│ Sichuan │ 12 │ Asia │
│ Chengdu │ 12 │ Asia │
│ America │ 9 │ America │
│ North America │ 10 │ North America │
│ Eurasia │ 11 │ Eurasia │
│ Asia │ 12 │ Asia │
└────────────────────────────────────────────┴────┴───────────────────────────────────────────────────────────────┘regionToTopContinent
Devuelve el continente de nivel superior en la jerarquía para la región.
Sintaxis
regionToTopContinent(id[, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples Geobases. String. Opcional.
Valor devuelto
- Identificador del continente de nivel superior (al subir por la jerarquía de regiones).UInt32.
- 0, si no existe ninguno.
Ejemplo
SELECT regionToName(number::UInt32, 'en'), regionToTopContinent(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13);┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─id─┬─regionToName(regionToTopContinent(CAST(number, 'UInt32')), 'en')─┐
│ │ 0 │ │
│ World │ 0 │ │
│ USA │ 9 │ America │
│ Colorado │ 9 │ America │
│ Boulder County │ 9 │ America │
│ Boulder │ 9 │ America │
│ China │ 11 │ Eurasia │
│ Sichuan │ 11 │ Eurasia │
│ Chengdu │ 11 │ Eurasia │
│ America │ 9 │ America │
│ North America │ 9 │ America │
│ Eurasia │ 11 │ Eurasia │
│ Asia │ 11 │ Eurasia │
└────────────────────────────────────────────┴────┴──────────────────────────────────────────────────────────────────┘regionToPopulation
Obtiene la población de una región. La población puede estar registrada en archivos de geobase. Consulte la sección "Diccionarios". Si la población no está registrada para la región, devuelve 0. En la geobase, la población puede estar registrada para regiones subordinadas, pero no para las regiones superiores.
Sintaxis
regionToPopulation(id[, geobase])Parámetros
id— ID de la región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- Población de la región. UInt32.
- 0, si no existe.
Ejemplo
SELECT regionToName(number::UInt32, 'en'), regionToPopulation(number::UInt32) AS id, regionToName(id, 'en') FROM numbers(13);┌─regionToName(CAST(number, 'UInt32'), 'en')─┬─population─┐
│ │ 0 │
│ World │ 4294967295 │
│ USA │ 330000000 │
│ Colorado │ 5700000 │
│ Boulder County │ 330000 │
│ Boulder │ 100000 │
│ China │ 1500000000 │
│ Sichuan │ 83000000 │
│ Chengdu │ 20000000 │
│ America │ 1000000000 │
│ North America │ 600000000 │
│ Eurasia │ 4294967295 │
│ Asia │ 4294967295 │
└────────────────────────────────────────────┴────────────┘regionIn
Comprueba si una región lhs pertenece a una región rhs. Devuelve un valor UInt8 igual a 1 si pertenece, o 0 si no.
Sintaxis
regionIn(lhs, rhs\Parámetros
lhs— ID de región delhsde la geobase. UInt32.rhs— ID de región derhsde la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- 1, si pertenece. UInt8.
- 0, si no pertenece.
Detalles de implementación
La relación es reflexiva: cualquier región también pertenece a sí misma.
Ejemplo
SELECT regionToName(n1.number::UInt32, 'en') || (regionIn(n1.number::UInt32, n2.number::UInt32) ? ' is in ' : ' is not in ') || regionToName(n2.number::UInt32, 'en') FROM numbers(1,2) AS n1 CROSS JOIN numbers(1,5) AS n2;World is in World
World is not in USA
World is not in Colorado
World is not in Boulder County
World is not in Boulder
USA is in World
USA is in USA
USA is not in Colorado
USA is not in Boulder County
USA is not in Boulder regionHierarchy
Acepta un número UInt32: el ID de región de la geobase. Devuelve un array de ID de región que incluye la región proporcionada y todas sus regiones padre en la jerarquía.
Sintaxis
regionHierarchy(id\Parámetros
id— ID de región de la geobase. UInt32.geobase— Clave del diccionario. Consulte Múltiples geobases. String. Opcional.
Valor devuelto
- Array de ID de región que consta de la región proporcionada y de todos sus padres en la cadena. Array(UInt32).
Ejemplo
SELECT regionHierarchy(number::UInt32) AS arr, arrayMap(id -> regionToName(id, 'en'), arr) FROM numbers(5);┌─arr────────────┬─arrayMap(lambda(tuple(id), regionToName(id, 'en')), regionHierarchy(CAST(number, 'UInt32')))─┐
│ [] │ [] │
│ [1] │ ['World'] │
│ [2,10,9,1] │ ['USA','North America','America','World'] │
│ [3,2,10,9,1] │ ['Colorado','USA','North America','America','World'] │
│ [4,3,2,10,9,1] │ ['Boulder County','Colorado','USA','North America','America','World'] │
└────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────┘