Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Lambda函数将csv从s3转换为拼花地板_Python 3.x_Aws Lambda - Fatal编程技术网

Python 3.x Lambda函数将csv从s3转换为拼花地板

Python 3.x Lambda函数将csv从s3转换为拼花地板,python-3.x,aws-lambda,Python 3.x,Aws Lambda,我有一个要求- 1.将s3中的拼花地板文件转换为csv格式,并将其放回s3。该过程应排除使用电子病历。 2.拼花文件有100多个col,我需要从拼花文件中提取4个col并在s3中创建csv 有没有人能解决这个问题? 注意-不能使用EMR或AWS胶水 这完全取决于您的业务需求,您希望采取什么样的操作,比如异步调用或同步调用 当拼花文件到达指定的木桶时,可以异步触发s3木桶上的lambda 您可以将s3服务配置为在从bucket中添加/删除对象时也向SNS或SQS发送通知,然后bucket可以调用l

我有一个要求- 1.将s3中的拼花地板文件转换为csv格式,并将其放回s3。该过程应排除使用电子病历。 2.拼花文件有100多个col,我需要从拼花文件中提取4个col并在s3中创建csv

有没有人能解决这个问题? 注意-不能使用EMR或AWS胶水
  • 这完全取决于您的业务需求,您希望采取什么样的操作,比如异步调用或同步调用

  • 当拼花文件到达指定的木桶时,可以异步触发s3木桶上的lambda

  • 您可以将s3服务配置为在从bucket中添加/删除对象时也向SNS或SQS发送通知,然后bucket可以调用lambda来处理文件

  • 您可以每5分钟异步运行一次lambda,方法是使用cron表达式调度最佳分辨率为1分钟

  • 通过HTTPS(RESTAPI端点)同步调用lambda

  • 还值得检查您的拼花文件有多大,因为lambda最多可以运行15分钟,即900秒

  • 这页也值得一看


  • 假设您希望在AWS环境中保持轻松,并且不使用Spark(Glue/EMR),您可以通过以下方式使用AWS Athena:

  • 假设您的拼花文件位于S3://bucket/parquet/中
  • 您可以在数据目录中创建一个表(即使用Athena或胶水爬虫),指向该拼花地板位置。例如,在Athena SQL控制台中运行类似以下内容:
  • 一旦您可以查询您的拼花_表,该表将读取拼花文件,您应该能够通过以下方式创建CSV文件,也可以使用Athena并仅选择您感兴趣的4列:
  • 在此之后,您可以实际删除csv临时表,只使用s3://bucket/csv/下的csv文件,并执行更多操作,例如使用s3触发器Lambda函数并执行其他操作或类似操作

    请记住,所有这些都可以通过Lambda实现,与Athena交互(示例),并且记住,它有一个ODBC连接器和PyAthena,可以从Python或更多选项使用它,因此通过Lambda或AWS控制台使用Athena不是唯一的选项,以防您希望以不同的方式实现自动化

    我希望这有帮助

    附加编辑,2019年9月25日: 在回答您的问题时,关于在熊猫中这样做,我认为最好的方法是使用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)
    

    卡洛斯。

    值得一看最近雅典娜的CTAS查询:
    我们可以使用CTA以不同的格式存储查询结果。

    我只是在下面的答案中列出了从s3触发lambda的不同方式。因为问题被标记为aws lambda。还有其他的方法,而不是使用雅典娜或胶水爬虫。有使用pandas、pyarow、S3fs或StringIO的选项吗。如果是,这是如何实现的?我刚刚添加了一条评论,希望这能对您有所帮助。谢谢Carlos!!感谢您的快速响应和帮助!!
     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 ;
    
    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)