如何将带有 YYYYMMDD 列的 CSV 文件导入 ClickHouse 中的 DATE 列
Posted
技术标签:
【中文标题】如何将带有 YYYYMMDD 列的 CSV 文件导入 ClickHouse 中的 DATE 列【英文标题】:How to import a CSV file with a column with YYYYMMDD to a DATE column in ClickHouse 【发布时间】:2020-04-12 18:10:51 【问题描述】:我想将带有YYYYMMDD
列的CSV
文件导入到ClickHouse
中的DATE
列。 CSV
content: 20191231
的样本。我意识到ClickHouse
仅在CSV
中导入DATE
列,如果它的格式与YYYY-MM-DD
相同(仅在年、月和日之间使用“-
”)。我无法更改存储在http server
中的CSV
文件的格式。
请让我知道一种简单的方法或命令,可以从http server
导入数百个带有YYYYMMDD
的CSV
文件,或者我可以在哪里更改我的clickhouse
服务器中的配置以接受YYYYMMDD
格式而不是YYYY-MM-DD
?
我已经添加了一个新列,导入了所有文件并更新了表格。请参阅下面的查询。字段“olddatefield
”是 STRING
,“newdatefield
”是 DATE 字段。
ALTER TABLE test ADD COLUMN newdatefield Date AFTER olddatefield;
ALTER TABLE test
UPDATE newdatefield = toDate(concat(substring(olddatefield, 1, 4), '-' , substring(olddatefield, 5, 2), '-' , substring(olddatefield, 7, 2)))
WHERE olddatefield = '20191231';
它工作得很好,但是有数千个具有不同 DATES
的文件要导入,我不想编辑数千个 'alter table'
查询。
【问题讨论】:
【参考方案1】:需要依赖parseDateTimeBestEffort函数:
SELECT toDate(parseDateTimeBestEffort('20191231')) AS date
/*
┌───────date─┐
│ 2019-12-31 │
└────────────┘
*/
然后使用input-table函数需要更改数据上传方式来修复相关字段:
cat data.csv \
| clickhouse-client --query="INSERT INTO test SELECT toDate(parseDateTimeBestEffort(date)) AS date, id FROM input('date String, id Int32') FORMAT CSV";
data.csv
20191231, 1
20200101, 2
【讨论】:
以上是关于如何将带有 YYYYMMDD 列的 CSV 文件导入 ClickHouse 中的 DATE 列的主要内容,如果未能解决你的问题,请参考以下文章
如何将 CSV 导出复制到添加了新列的 Redshift 表中?