首页 > 解决方案 > 如何将带有 YYYYMMDD 列的 CSV 文件导入 ClickHouse 中的 DATE 列

问题描述

我想将一个包含一列的文件CSV导入YYYYMMDD到. 的样本。我意识到只有按原样格式导入一列(仅在年、月和日之间使用“”)。我无法更改存储在. 请让我知道一个简单的方法或命令来导入数百个文件,或者我可以在哪里更改我的服务器中的配置以接受格式而不是?DATEClickHouseCSV content: 20191231ClickHouseDATECSVYYYY-MM-DD-CSVhttp serverCSVYYYYMMDDhttp serverclickhouseYYYYMMDDYYYY-MM-DD

我已经添加了一个新列,导入了所有文件并更新了表格。请参阅下面的查询。字段 ' olddatefield' 是 aSTRING并且 ' 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'查询。

标签: clickhouse

解决方案


它需要依赖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";

数据.csv

20191231, 1
20200101, 2

推荐阅读