Lambda函数将CSV从S3转换为拼花

时间:2019-09-24 14:35:43

标签: python-3.x aws-lambda

我有一个要求- 1.要将s3中存在的拼花地板文件转换为csv格式,然后将其放回s3中。该过程应排除使用EMR。 2. Parquet文件具有超过100个cols,我只需要从该Parquet文件中提取4个cols并在s3中创建csv。

有人对此有任何解决方案吗? 注意-无法使用EMR或AWS Glue

3 个答案:

答案 0 :(得分:1)

假设您想在AWS环境中简化工作,并且不使用Spark(胶水/ EMR),则可以通过以下方式使用AWS Athena:

  1. 假设您的实木复合地板文件位于S3:// bucket / parquet /中。
  2. 您可以在数据目录中创建一个表(即使用Athena或Glue Crawler),指向该镶木地板位置。例如,在Athena SQL控制台中运行以下内容:
CREATE EXTERNAL TABLE parquet_table (
    col_1 string,
    ...
    col_100 string)
PARTITIONED BY (date string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' 
LOCATION 's3://bucket/parquet/' ;
  1. 一旦您可以查询将要读取镶木地板文件的parquet_table表,您就应该能够以以下方式创建CSV文件,也可以使用Athena并仅选择您感兴趣的4列:
 CREATE TABLE csv_table
 WITH (
     format = 'TEXTFILE', 
     field_delimiter = ',',
     external_location = 's3://bucket/csv/'
         ) 
 AS SELECT col_1, col_2, col_3, col_4
 FROM parquet_table ;

此后,您实际上可以删除csv临时表,仅使用s3:// bucket / csv /下的CSV文件,并执行更多操作,例如,通过使用S3-trigger Lambda函数并执行其他操作或相似。

请记住,所有这些都可以通过Lambda,与Athena交互(示例here)来实现,并且请记住,它具有ODBC连接器和PyAthena以便从Python使用它,或者有更多选择,因此请使用Athena通过Lambda或AWS控制台并不是唯一的选择,以防您想以其他方式自动执行此操作。

我希望这会有所帮助。

2019年9月25日的附加编辑: 回答关于在Pandas中执行此操作的问题,我认为最好的方法是使用Glue Python Shell,但是您提到您不想使用它。因此,如果您决定这样做,这是如何做的基本示例:

import pandas as pd
import boto3
from awsglue.utils import getResolvedOptions
from boto3.dynamodb.conditions import Key, Attr

args = getResolvedOptions(sys.argv,
                          ['region',
                           's3_bucket',
                           's3_input_folder',
                           's3_output_folder'])

## @params and @variables: [JOB_NAME]
##    Variables used for now. Job input parameters to be used.
s3Bucket = args['s3_bucket']
s3InputFolderKey = args['s3_input_folder']
s3OutputFolderKey = args['s3_output_folder']

## aws Job Settings
s3_resource = boto3.resource('s3')
s3_client = boto3.client('s3')
s3_bucket = s3_resource.Bucket(s3Bucket)

for s3_object in s3_bucket.objects.filter(Prefix=s3InputFolderKey):
    s3_key = s3_object.key
    s3_file = s3_client.get_object(Bucket=s3Bucket, Key=s3_key)

    df = pd.read_csv(s3_file['Body'], sep = ';')

    partitioned_path = 'partKey={}/year={}/month={}/day={}'.format(partKey_variable,year_variable,month_variable,day_variable)
    s3_output_file = '{}/{}/{}'.format(s3OutputFolderKey,partitioned_path,s3_file_name)

    # Writing file to S3 the new dataset:
    put_response = s3_resource.Object(s3Bucket,s3_output_file).put(Body=df)

卡洛斯。

答案 1 :(得分:0)

  • 这完全取决于您的业务需求,要采取哪种操作(例如异步或同步调用)。

  • 当实木复合地板文件到达指定存储桶时,您可以在s3存储桶上异步触发lambda github exampleaws s3 doc

  • 您可以配置s3服务,以便在从存储桶中添加/删除对象时也向SNS或SQS发送通知,然后可以依次调用lambda来处理文件Triggering a Notification

  • 您可以通过调度aws cloudwatch events每5分钟异步运行一次lambda,使用cron表达式的最佳分辨率是一分钟。

  • 通过HTTPS(REST API端点)using API Gateway.

  • 同步调用lambda
  • 还值得检查作为lambda的Parquet文件最大可以运行15分钟(即900秒)。

  • 还需要检查此页面Using AWS Lambda with Other Services

答案 2 :(得分:0)

最近值得一看的是雅典娜的CTAS查询:https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html 我们可以使用CTAS将查询结果存储为其他格式。