s3 - 如何获得文件的快速行数? wc -l太慢了

时间:2018-04-06 01:33:42

标签: amazon-web-services amazon-s3 boto boto3 aws-cli

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

对不,我这样做,它可以工作,但是对于一个20GB的文件需要大约10分钟:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background_v2"
tools:context="com.example.android.java.JoyStickActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:id="@+id/linearLayout">

    <com.example.android.java.JoyStickView
        android:id="@+id/joystickLeft"
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_alignParentStart="true"
        android:layout_weight="0.5" />


    <com.example.android.java.JoyStickView
        android:id="@+id/joystickRight"
        android:layout_width="wrap_content"
        android:layout_height="200dp"
        android:layout_weight="0.5" />

</LinearLayout>
<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_below="@+id/linearLayout4"
    android:layout_marginStart="39dp"
    android:layout_marginTop="42dp"
    android:layout_toEndOf="@+id/linearLayout5"
    android:layout_weight="1">

    <Switch
        android:id="@+id/turbo_switch_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="85dp"
        android:layout_marginTop="14dp"
        android:rotation="90"
        android:scaleX="1"
        android:scaleY="0.8"
        android:thumb="@drawable/thumb"
        android:track="@drawable/track" />
</RelativeLayout>

</RelativeLayout>

3 个答案:

答案 0 :(得分:4)

这里有两种可能对你有用的方法......

Amazon S3有一项名为S3 Select的新功能,可让您查询存储在S3上的文件。

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

S3 Select

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以使用 python/boto3 来完成。 定义bucket_name和前缀:

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

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

现在您可以打开 S3 SELECT 游标:

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}},
    
)

现在遍历返回的记录:

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