【问题标题】:Create large dataset by duplicating records通过复制记录创建大型数据集
【发布时间】:2019-04-04 19:07:03
【问题描述】:

我在 csv 中有一个示例数据集。它只有约 50K 行。我想针对这个数据集测试 SQL 查询的性能,但是 50K 行对于这个目的来说太小了。采用现有 csv 并创建一个比原始 csv 大 N 倍且每行重复 N 次的新 csv 的最佳方法是什么?

例如,如果 N = 5

输入的csv是:

col1, col2, col3
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'

所需的输出 csv 将是:

col1, col2, col3
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'
1, 'some string', '1999-01-01'
2, 'another string', '2001-01-01'

欢迎使用 bash、python 或 SQL 解决方案

首选 bash 或 python 解决方案,因为我正在跨多个数据库平台进行测试

【问题讨论】:

  • 您可以在线下载大型 csv 文件进行测试:eforexcel.com/wp/…
  • @ErayBalkanli 我正在测试的查询特定于我正在使用的数据模型,因此这不是可接受的替代方案。

标签: python sql bash csv bigdata


【解决方案1】:

由于您尚未指定您计划针对哪个 RDBMS 执行 SQL,我将为您提供 PostgreSQL 的解决方案。

首先,您可以使用 COPY 命令将 CSV 数据复制到 PostgreSQL。

然后您可以使用 generate_series 函数像这样扩展您的数据(CTE csv 仅用于测试目的):

with srs as (
    select a
    from generate_series(0,99) a
),
csv as (
    select *
    from mycsv
)
select *
from csv
join srs on true

根据您的需要进行调整。这个生成的内容是 CTE csv 的 99 倍。

【讨论】:

  • PostgreSQL 没问题。假设我已经将一个表“mycsv”复制到 PostgreSQL 中。你能概括一下这个答案,以便不必指定列名和值,结果表仍称为“mycsv”吗?
【解决方案2】:

我为此目的制作了小python脚本:

# mulcsv.py 
import sys

def main(fname_in, fname_out, N):
    header = None
    content = []
    with open(fname_in, "r") as fin:
        for linenr, line in enumerate(fin,1):
            # remove NL? line = line.strip()
            if linenr==1:
                header = line
            else:
                content.append(line)

    with open(fname_out, "w") as fout:
        fout.write(header)
        for nr in range(N):
            fout.write("".join(content))
    print("Output in %s" % fname_out)

if __name__=="__main__":
    if len(sys.argv)!=4:
        print("Usage: %s <fname-in>.csv <fname-out>.csv N" % (sys.argv[0],))
        sys.exit(0)
    # TODO: check and parse arguments (in file existing, N is positive integer) - use argsparse?
    main(fname_in = sys.argv[1], fname_out = sys.argv[2], N = int(sys.argv[3]))
    # TESTING: main(fname_in = "r.csv", fname_out = "r2.csv", N = 5)

并称它为:

python mulcsv.py input.csv output.csv 5

为了更好的参数验证/解析,请使用argsparse

【讨论】:

    【解决方案3】:

    使用 bash:

    n=5
    (head -n1 file; for i in $(seq 1 $n); do tail -n+2 file; done) > output.csv
    

    head 命令显示标题。

    for 运行命令 tail 的 5 次,该命令显示除第一行之外的 file 的内容(-n+2 设置第二行的偏移量)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多