如何将带有 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 列。 CSVcontent: 20191231 的样本。我意识到ClickHouse 仅在CSV 中导入DATE 列,如果它的格式与YYYY-MM-DD 相同(仅在年、月和日之间使用“-”)。我无法更改存储在http server 中的CSV 文件的格式。 请让我知道一种简单的方法或命令,可以从http server 导入数百个带有YYYYMMDDCSV 文件,或者我可以在哪里更改我的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 表中?

使用带有过滤器和其他列的 pyspark 将 CSV 转换为 JSON [关闭]

使用 bq load 加载带有 NULL 列的 CSV

对于带有 csv 列的循环(熊猫)

如何从带有向量列的 DataFrame 创建张量流数据集?

使用 phpMyAdmin 将带有部分数据的制表符分隔的 csv 文件导入 mysql 表