Добрый день. Подскажите пожалуйста как работает блок execute command в словарях?
Мне нужно выполнять линукс команду, которая будет заменять все html entities на нужные символы.
Например у меня в таблице есть колонка name - в которой есть сущности " '
Мне нужно заменить в имени каждой строки эти сущности на правильный знак
с помощью команды:
echo 'Rib <' | recode html..ascii
Можно ли это сделать с помощью словарей?
Для работы с executable словарями важно, чтобы STDOUT возвращал обратно такое же значение ключа, какое было передано при использовании функции dictGet*.
Например,
при использовании dictGetUInt64('geoip2', 'asn', tuple(ip)) и формата JSONEachRow:
для STDIN {"ip": "8.8.8.8"} приложение должен вернуть в STDOUT {"ip": "8.8.8.8", "asn": 15169}
По этой причине недостаточно вернуть только результат, нужно вернуть и исходные данные для сопоставления ключа.
_Также хочу обратить внимание, что CH по какой-то причине не отправляет данные в STDIN, до тех пор, пока ваше приложение не начнет запись в STDOUT (см. #1697)_
Ещё из "побочных" эффектов - запрос будет выполняться в несколько потоков, но доступ к словарю будет только одним потоком. Т.е. это выглядит примерно так: все данные быстро и эффективно обрабатываются, ну скажем в 16 потоков, используя все можности процессора, а потом приходит момент когда нужно "заглянуть в словарь" и все резко замедляется, т.к. все 16 потоков "встают в очередь" за данными из словаря, который будет выполняться в одном потоке и тянуть данные блок за блоком (обычно по 65 тысяч записей в блоке).
ЗЫ. Очень хотелось бы иметь возможность "подкрутить" то как кликхаус читает словари - например разрешать читать многопоточно (даже в ущерб тому, что те же самые данные будут многократно запрошены с разных потоков, ну и ограничение на количество одновременно работающих потоков), использовать те же подлючения многократно (в том числе в разных словарах), изменять размер блока который запрашивается "за один раз", сделать способ хранения - "no store / no cache" - когда данные запрашиваются из внешнего источника каждый раз, без проверки времени жизни, хранения предыдущих значений в памяти и т.п. (это конечно очень медленно, но при некоторых сценариях и так лучше, чем то же самое но с бесполезным кэшированием).
@namikhnenko
@evillique
@kekekekule
@filimonov This feature was implemented by @nikitamikhaylov in #8303
Most helpful comment
Ещё из "побочных" эффектов - запрос будет выполняться в несколько потоков, но доступ к словарю будет только одним потоком. Т.е. это выглядит примерно так: все данные быстро и эффективно обрабатываются, ну скажем в 16 потоков, используя все можности процессора, а потом приходит момент когда нужно "заглянуть в словарь" и все резко замедляется, т.к. все 16 потоков "встают в очередь" за данными из словаря, который будет выполняться в одном потоке и тянуть данные блок за блоком (обычно по 65 тысяч записей в блоке).
ЗЫ. Очень хотелось бы иметь возможность "подкрутить" то как кликхаус читает словари - например разрешать читать многопоточно (даже в ущерб тому, что те же самые данные будут многократно запрошены с разных потоков, ну и ограничение на количество одновременно работающих потоков), использовать те же подлючения многократно (в том числе в разных словарах), изменять размер блока который запрашивается "за один раз", сделать способ хранения - "no store / no cache" - когда данные запрашиваются из внешнего источника каждый раз, без проверки времени жизни, хранения предыдущих значений в памяти и т.п. (это конечно очень медленно, но при некоторых сценариях и так лучше, чем то же самое но с бесполезным кэшированием).