我试图将Maxmind数据插入Clickhouse字典,但将其定义为本地文件,我可以从其中运行我的客户端。
定义我的字典,我使用查询:
CREATE DICTIONARY usage_analytics.city_locations(
geoname_id UInt64 DEFAULT 0,
...
...
...
...
)
PRIMARY KEY geoname_id
SOURCE(File(path '/home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv' format 'CSVWithNames'))
SETTINGS(format_csv_allow_single_quotes = 0)
LAYOUT(HASHED())
LIFETIME(300);
但是我总是遇到错误:
Failed to load dictionary 'usage_analytics.city_locations': std::exception. Code: 1001, type: std::__1::__fs::filesystem::filesystem_error, e.what() = filesystem error: in canonical: No such file or directory [home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv] [/],
根据文档,我必须使用它的绝对路径,我使用了readlink,它仍然无法检测到我的文件。我从远程机器运行clickhouse客户端,并有远程机器上的文件。我的文件应该放在别的地方吗?
看起来这个文件不可用,要修复它需要为文件设置正确的所有权:
chown clickhouse:clickhouse /home/ubuntu/maxmind_csv/GeoLite2-City-Locations-en.csv
# chown -R clickhouse:clickhouse /home/ubuntu/maxmind_csv
. xml字典允许从任何文件夹读取文件。
https://clickhouse.tech/docs/en/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-sources/dicts-external_dicts_dict_sources-local_file
当使用DDL命令(CREATE dictionary…)创建带有源文件的字典时,源文件需要位于user_files目录下,以防止DB用户访问ClickHouse节点上的任意文件。
/etc/clickhouse-server/config . xml
<!-- Directory with user provided files that are accessible by 'file' table function. -->
<user_files_path>/var/lib/clickhouse/user_files/</user_files_path>