【问题标题】:Shard CSV based on time values [closed]基于时间值的分片 CSV [关闭]
【发布时间】:2020-01-09 23:56:31
【问题描述】:

我有一个 1 TB 的 CSV 文件。它看起来像:

time,timezone,name,...
2020-01-09 04:05:12.23567,+8,test1
2020-01-09 04:06:00.00000,+8,test1
2020-01-09 04:07:00.00000,+8,test1
2020-01-09 04:08:00.00000,+8,test1
2020-01-09 04:09:00.00000,+8,test1
2020-01-09 04:07:00.00000,+8,test2
2020-01-09 04:08:00.00000,+8,test2
2020-01-09 04:09:00.00000,+8,test2
2020-01-09 12:00:00.00000,+0,test1
2020-01-09 13:00:00.00000,+0,test1
2020-01-09 14:00:00.00000,+0,test1
2020-01-09 15:00:00.00000,+0,test1
2020-01-09 19:00:00.00000,-6,test2

我想对其进行分片,以便数据位于date-name.csv 中,其中date 是UTC 日期。

在这个例子中,我最终会得到

2020-01-08-test1.csv

time,timezone,name,...
2020-01-09 04:05:12.23567,+8,test1
2020-01-09 04:06:00.00000,+8,test1
2020-01-09 04:07:00.00000,+8,test1
2020-01-09 04:08:00.00000,+8,test1
2020-01-09 04:09:00.00000,+8,test1

2020-01-08-test2.csv

time,timezone,name,...
2020-01-09 04:07:00.00000,+8,test2
2020-01-09 04:08:00.00000,+8,test2
2020-01-09 04:09:00.00000,+8,test2

2020-01-09-test1.csv

time,timezone,name,...
2020-01-09 12:00:00.00000,+0,test1
2020-01-09 13:00:00.00000,+0,test1
2020-01-09 14:00:00.00000,+0,test1

2020-01-10-test2.csv

time,timezone,name,...
2020-01-09 19:00:00.00000,-6,test2

数据集非常庞大,而我采用的 Python 方法太慢了。我希望有一些更有效的方法来使用管道和简单的 bash 命令。

【问题讨论】:

  • 我天真的想法告诉我awk '{ print > $1 "-test.csv" }'。为什么2020-01-10-test2.csvtest2 而不仅仅是test?这里的规则是什么?文件名是如何创建的?日期是 UTC 重要吗?请发布您尝试过的内容,请发布您的python方法。
  • test2 来自name 列。日期为 UTC 至关重要。不幸的是,我无法发布 Python,但它在 Pandas 中一次加载几百万行,执行日期操作,找到唯一的日期/名称对,然后写入这些文件。
  • “太慢”有多慢?你有多少内存/CPU?硬盘还是固态硬盘?您最终有多少个独特的日期(数万、数万、数百万……)?
  • 嗨@ScottKennedy 我已经编辑了我的回复。现在它应该可以工作了stackoverflow.com/a/59682909/757714

标签: bash csv


【解决方案1】:

使用 Miller (https://github.com/johnkerl/miller) 并运行

mlr --csv --from input.csv put -q 'tee > strftime((strptime(($time."Z"), "%Y-%m-%d %H:%M:%SZ"))-($timezone*60*60),"%Y-%m-%d")."-".$name.".csv", $*'

你会有

cat 2020-01-08-test1.csv

time,timezone,name
2020-01-09 04:05:12.23567,+8,test1
2020-01-09 04:06:00.00000,+8,test1
2020-01-09 04:07:00.00000,+8,test1
2020-01-09 04:08:00.00000,+8,test1
2020-01-09 04:09:00.00000,+8,test1

cat 2020-01-08-test2.csv

time,timezone,name
2020-01-09 04:07:00.00000,+8,test2
2020-01-09 04:08:00.00000,+8,test2
2020-01-09 04:09:00.00000,+8,test2

cat 2020-01-09-test1.csv

time,timezone,name
2020-01-09 12:00:00.00000,+0,test1
2020-01-09 13:00:00.00000,+0,test1
2020-01-09 14:00:00.00000,+0,test1
2020-01-09 15:00:00.00000,+0,test1

cat 2020-01-10-test2.csv

time,timezone,name
2020-01-09 19:00:00.00000,-6,test2

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 2020-07-12
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多