Python 3.x Lambda函数将csv从s3转换为拼花地板
我有一个要求- 1.将s3中的拼花地板文件转换为csv格式,并将其放回s3。该过程应排除使用电子病历。 2.拼花文件有100多个col,我需要从拼花文件中提取4个col并在s3中创建csv 有没有人能解决这个问题? 注意-不能使用EMR或AWS胶水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
假设您希望在AWS环境中保持轻松,并且不使用Spark(Glue/EMR),您可以通过以下方式使用AWS Athena:
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)