Как я могу создать внешний словарь из URL в clickhouse? - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь создать словарь из http://standards-oui.ieee.org/oui/oui.csv С этим кодом:

CREATE DICTIONARY TestDict (
            registry String DEFAULT '',
            assignment String DEFAULT '',
            name String DEFAULT '',
            address String DEFAULT ''
        )
        PRIMARY KEY assignment
        SOURCE(HTTP(
            url 'http://standards-oui.ieee.org/oui/oui.csv'
            format 'CSVWithNames'
        ))
        LAYOUT(FLAT())
        LIFETIME(300)

Но когда я пытаюсь select * from default.TestDict, он возвращает ошибку "Таблица default.testDict не существует ". И тогда статус словаря изменится на «СБОЙ». Что я делаю неправильно?

1 Ответ

2 голосов
/ 02 апреля 2020

Сначала давайте посмотрим на словарь last_exception -param:

SELECT *
FROM system.dictionaries
FORMAT Vertical
/*
..
last_exception: Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected , before: MA-L,002272,American Micro-Fuel Device Corp.,2181 Buchanan Loop Ferndale WA US 98248 \r\nMA-L,00D0EF,IGT,9295 PROTOTYPE DRIVE RENO NV US 89511 \r\nMA-L,086195,Rockw: (at row 1)

Row 1:
Column 0,   name: assignment, type: UInt64, ERROR: text "MA-L,00227" is not like UInt64
..
*/

Причина проблемы в неправильном выборе макета: FLAT -layout ожидает цифра c первичный ключ с типом UInt64 вместо String.

Необходимо использовать составной ключ , поддерживающий строковый тип и связанный COMPLEX_KEY_HASHED -layout.

CREATE DICTIONARY TestDict
(
    registry String DEFAULT '', 
    assignment String DEFAULT '', 
    name String DEFAULT '', 
    address String DEFAULT ''
)
PRIMARY KEY registry, assignment, name
SOURCE(HTTP(URL 'http://standards-oui.ieee.org/oui/oui.csv' FORMAT CSVWithNames))
LIFETIME(MIN 0 MAX 300)
LAYOUT(COMPLEX_KEY_HASHED())

Учитывать этот первичный ключ состоит из трех столбцов (реестр, назначение, имя) для уникальной идентификации каждой строки.

SELECT count()
FROM default.TestDict
/* result
┌─count()─┐
│   27742 │
└─────────┘
*/
...