代码之家  ›  专栏  ›  技术社区  ›  tooptoop4

s3-如何快速计算文件的行数?wc-l太慢

  •  5
  • tooptoop4  · 技术社区  · 6 年前

    有没有人能快速获得S3中托管文件的行数?最好使用CLI、s3api,但我也对python/boto持开放态度。 注意:解决方案必须以非交互方式运行,即隔夜批量运行。

    对不对,我正在这样做,但20GB文件大约需要10分钟:

     aws cp s3://foo/bar - | wc -l
    
    3 回复  |  直到 6 年前
        1
  •  11
  •   John Rotenstein    6 年前

    这里有两种方法可能适合您。。。

    Amazon S3有一个新功能,名为 S3 Select 它允许您查询存储在S3上的文件。

    您可以对文件中的记录数(行)进行计数,甚至可以对GZIP文件进行计数。结果可能因文件格式而异。

    S3 Select

    亚马逊雅典娜 也是一个类似的可能合适的选项。它可以查询存储在Amazon S3中的文件。

        2
  •  3
  •   Soujanya G    6 年前

    是的,Amazon S3具有选择功能,在从选择选项卡执行任何查询时,也要关注成本。。 例如,以下是2018年6月的价格(可能有所不同) S3选择定价基于输入、输出和传输数据的大小。 每个查询的扫描成本为每GB 0.002美元,再加上返回的每GB 0.0007美元。

        3
  •  1
  •   Alex B    3 年前

    您可以使用python/boto3来完成。 定义bucket\u名称和前缀:

    colsep = ','
    s3          = boto3.client('s3')
    bucket_name = 'my-data-test'
    s3_key = 'in/file.parquet'
    

    请注意,S3 SELECT一次只能访问一个文件。

    现在,您可以打开S3选择光标:

    sql_stmt    = """SELECT count(*) FROM s3object S"""  
    req_fact =s3.select_object_content(
        Bucket  = bucket_name,
        Key     = s3_key,
        ExpressionType  = 'SQL',
        Expression      = sql_stmt,
        InputSerialization={'Parquet': {}},
        OutputSerialization = {'CSV': {
                    'RecordDelimiter': os.linesep,
                    'FieldDelimiter': colsep}},
        
    )
    

    现在迭代thourgh返回的记录:

    for event in req_fact['Payload']:
        if 'Records' in event:
            rr=event['Records']['Payload'].decode('utf-8')
            for i, rec in enumerate(rr.split(linesep)):
                if rec:
                    row=rec.split(colsep)
                    if row:
                        print('File line count:', row[0])
    

    如果要计算给定S3目录中所有拼花文件中的记录,请查看以下python/boto3脚本: S3-parquet-files-row-counter