有没有人能快速获取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>
答案 0 :(得分:4)
这里有两种可能对你有用的方法......
Amazon S3有一项名为S3 Select的新功能,可让您查询存储在S3上的文件。
您可以对文件中的记录(行)数进行计数,甚至可以对GZIP文件进行操作。结果可能因文件格式而异。
亚马逊雅典娜也是一个类似的选项,可能适合。它可以查询存储在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