将文本转换为Parquet

时间:2017-10-16 14:55:07

标签: amazon-web-services amazon-s3 amazon-athena

我在Amazon S3上将管道分隔的未分区数据作为文本文件,我已从redshift中卸载以清除我们的redshift节点上的空间。我在Athena中创建了一个表来访问这些数据,但我想优化我的数据以获得性能。我正在尝试使用AWS EMR将我的数据转换为镶木地板格式,并将它们存储在s3存储桶上作为镶木地板格式的文件。我尝试按照AWS网站上的说明进行操作,但我发现说明有点令人困惑。

2 个答案:

答案 0 :(得分:1)

如果没有关于您尝试转换的数据或您遇到的错误的某些具体细节,很难找到对您最有帮助的内容。但希望我的经验中的以下提示会有所帮助:

<强> 1。找出原始数据外观 可能,您要转换的数据将存储在Amazon S3存储桶中,通常每个不同的表存储在单独的文件夹中,每个文件夹将该数据的内容划分为压缩文本文件。理解格式对于在下一步中编写正确的Hive命令至关重要。

<强> 2。写木地板转换DDL脚本 Parquet转换过程中的关键元素是基于Hive的DDL(数据定义语言)脚本,该脚本描述了表的模式(包括数据类型),并指向输入数据的存储位置以及输出数据应该在何处结束。通常,&#34; ddl&#34;描述原始数据基础结构的文件与数据一起提供,或者在某处描述模式。例如,这是一个用于s3存储桶&#34;文件夹&#34;的Parquet转换DDL脚本。使用特定架构:

ADD JAR /usr/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.0.0-amzn-5.jar;

CREATE EXTERNAL TABLE offer (
offer_sid VARCHAR(36),
created TIMESTAMP,
offer_id VARCHAR(100),
offer_position VARCHAR(100),
page_position VARCHAR(100),
vertical VARCHAR(100),
partner VARCHAR(100),
card_name VARCHAR(255))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://yourdata/raw/table' ;

CREATE EXTERNAL TABLE parquet_hive (
offer_sid VARCHAR(36),
created TIMESTAMP,
offer_id VARCHAR(100),
offer_position VARCHAR(100),
page_position VARCHAR(100),
vertical VARCHAR(100),
partner VARCHAR(100),
card_name VARCHAR(255))
STORED AS PARQUET
LOCATION 's3://yourdata/parquet/table/';

INSERT OVERWRITE TABLE parquet_hive SELECT * FROM offer;

这里,第一行表示用于解释即将发表的语句的Hive版本。请注意,您在此处选择的Hive版本将确定支持哪个data types,这一点非常重要。点击此处查看亚马逊提供的不同Hive versions

下一行代码创建DDL语句指定的表。原始数据的位置用&#34; LOCATION&#34;表示。更重要的是,数据的格式(在步骤(1)中确定)用&#34;行格式表示。&#34;这里,SerDe(串行器/解串器)接口OpenCSVSerde很好地处理存储在双引号中的行中的数据值。默认情况下,OpenCSVSerde使用双引号作为引号字符,使用逗号作为分隔符。请注意,并非所有原始数据格式都需要此SerDe接口;双引号情况有点特殊。

最后一行的行定义了最终Parquet表的模式(用&#34表示; STORED AS PARQUET&#34;),Parquet文件最终的输出位置,然后写入包含来自第一个表。

第3。在EMR群集上执行Parquet脚本 编写特定于表的Parquet转换脚本后,将其上载到单独文件夹中的相应S3存储桶(在本例中,在s3:// yourdata / parquet_scripts中为write-parquet-table.q)。该脚本将在安装了Hive的EMR集群上执行。以下是使用AWS CLI(命令行界面)启动EMR集群以执行脚本的示例命令:

aws emr create-cluster --enable-debugging --log-uri s3://yourdata/parquetLogs --applications Name=Hadoop Name=Hive Name=HCatalog --ec2-attributes KeyName=your_pemkey,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-888777ff --service-role EMR_DefaultRole --release-label emr-5.3.0 --instance-type m4.xlarge --instance-count 1 --steps Type=HIVE,Name="Convert offer to Parquet",ActionOnFailure=CONTINUE,ActionOnFailure=TERMINATE_CLUSTER,Args=[-f,s3://yourdata/parquet_scripts/write-parquet-table.q,-hiveconf,INPUT=s3://yourdata/raw/table/,-hiveconf,OUTPUT=s3://yourdata/parquet/table,-hiveconf,REGION=us-east-1] --region us-east-1 --auto-terminate --profile your_profile

除了提供s3存储桶deails,pemkey name和aws cli配置文件外,还需要将SubnetId = subnet-888777ff更改为有效的子网。现在,在AWS仪表板中标识可用的VPC子网,并将上面命令中的subnet-888777ff替换为其id。

此特定命令会旋转在m4.xlarge EC2实例上运行的EMR集群,将调试日志写入s3:// yourdata / parquetLogs,执行Parquet转换脚本&#34; write-parquet-table.q,& #34;并使用AWS CLI凭证配置文件&#34; your_profile&#34;。根据原始数据的大小和您使用的实例的大小,完成Parquet转换过程所需的时间量会有很大差异。脚本完成后,EMR集群将自行终止,Parquet格式的数据将准备好导入Amazon Athena等界面。

答案 1 :(得分:1)

现在,您可以使用Redshift Unload以Parquet格式导出数据,从而简化流程。您将不需要EMR或Athena:

UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
FORMAT PARQUET

可以在UNLOAD - Amazon Redshift

找到文档