我有一个要求- 1.要将s3中存在的拼花地板文件转换为csv格式,然后将其放回s3中。该过程应排除使用EMR。 2. Parquet文件具有超过100个cols,我只需要从该Parquet文件中提取4个cols并在s3中创建csv。
有人对此有任何解决方案吗? 注意-无法使用EMR或AWS Glue
答案 0 :(得分:1)
假设您想在AWS环境中简化工作,并且不使用Spark(胶水/ EMR),则可以通过以下方式使用AWS Athena:
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/' ;
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 example。 aws s3 doc
您可以配置s3服务,以便在从存储桶中添加/删除对象时也向SNS或SQS发送通知,然后可以依次调用lambda来处理文件Triggering a Notification。
您可以通过调度aws cloudwatch events每5分钟异步运行一次lambda,使用cron表达式的最佳分辨率是一分钟。
通过HTTPS(REST API端点)using API Gateway.
还值得检查作为lambda的Parquet文件最大可以运行15分钟(即900秒)。
答案 2 :(得分:0)
最近值得一看的是雅典娜的CTAS查询:https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html 我们可以使用CTAS将查询结果存储为其他格式。