转换为列式格式 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

转换为列式格式

如果您将数据转换为开源列式格式(如 Apache ParquetORC),则您的 Amazon Athena 查询性能将改进。

注意

使用 CREATE TABLE AS (CTAS) 查询,在一个步骤中执行转换到列式格式,如 Parquet 和 ORC。

您还可以通过在 Amazon EMR 中创建集群并使用 Hive 转换它来对现有 Amazon S3 数据源执行此操作。以下使用 AWS CLI 的示例为您演示如何使用存储在 Amazon S3 中的脚本和数据执行此操作。

概览

使用 EMR 集群转换为列式格式的过程如下所示:

  1. 创建一个安装了 Hive 的 EMR 集群。

  2. 在集群创建语句的步骤部分中,指定存储在 Amazon S3 中的脚本,它指向您的输入数据,并在 Amazon S3 位置创建列式格式的输出数据。在此示例中,集群自动终止。

    注意

    该脚本基于 Amazon EMR 版本 4.7,需要更新为最新版本。有关版本的信息,请参阅 Amazon EMR 版本指南

    完整脚本位于 Amazon S3 上的以下位置:

    s3://athena-examples-myregion/conversion/write-parquet-to-s3.q

    下面的示例脚本以 CREATE TABLE 代码段开头:

    ADD JAR /usr/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.0.0-amzn-5.jar; CREATE EXTERNAL TABLE impressions ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string, number string, processId string, browserCookie string, requestEndTime string, timers struct<modelLookup:string, requestTime:string>, threadId string, hostname string, sessionId string) PARTITIONED BY (dt string) ROW FORMAT serde 'org.apache.hive.hcatalog.data.JsonSerDe' with serdeproperties ( 'paths'='requestBeginTime, adId, impressionId, referrer, userAgent, userCookie, ip' ) LOCATION 's3://MyRegion.elasticmapreduce/samples/hive-ads/tables/impressions/' ;
    注意

    LOCATION 子句中的 MyRegion 替换为您运行查询的区域。例如,如果您的控制台位于 us-west-1,则为 s3://us-west-1.elasticmapreduce/samples/hive-ads/tables/

    这将在 Hive 中使用位于 Amazon EMR 示例存储桶中的示例在集群上创建表。

  3. 在 Amazon EMR 4.7.0 版中,包括 ADD JAR 行以查找适当的 JsonSerDe。修饰过的示例数据如下所示:

    { "number": "977680", "referrer": "fastcompany.com", "processId": "1823", "adId": "TRktxshQXAHWo261jAHubijAoNlAqA", "browserCookie": "mvlrdwrmef", "userCookie": "emFlrLGrm5fA2xLFT5npwbPuG7kf6X", "requestEndTime": "1239714001000", "impressionId": "1I5G20RmOuG2rt7fFGFgsaWk9Xpkfb", "userAgent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506; InfoPa", "timers": { "modelLookup": "0.3292", "requestTime": "0.6398" }, "threadId": "99", "ip": "67.189.155.225", "modelId": "bxxiuxduad", "hostname": "ec2-0-51-75-39.amazon.com", "sessionId": "J9NOccA3dDMFlixCuSOtl9QBbjs6aS", "requestBeginTime": "1239714000000" }
  4. 在 Hive 中,从分区加载数据,因此脚本运行以下内容:

    MSCK REPAIR TABLE impressions;

    然后,该脚本在 Amazon S3 上 Parquet 格式文件中创建一个存储数据的表:

    CREATE EXTERNAL TABLE parquet_hive ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string ) STORED AS PARQUET LOCATION 's3://myBucket/myParquet/';

    数据将会从 impressions 表插入到 parquet_hive 中:

    INSERT OVERWRITE TABLE parquet_hive SELECT requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip FROM impressions WHERE dt='2009-04-14-04-05';

    该脚本将从日期 2009-04-14-04-05 开始的 impressions 表列存储到 s3://myBucket/myParquet/ 中一个 Parquet 格式的文件内。

  5. 在您的 EMR 集群终止后,在 Athena 中创建您的表,它使用集群生成格式的数据。

开始之前

示例:使用 EMR 集群将数据转换为 Parquet

  1. 使用 AWS CLI 创建集群。如果您需要安装 AWS CLI,请参阅 AWS Command Line Interface 用户指南中的安装 AWS Command Line Interface

  2. 您需要具有角色才能使用 Amazon EMR,因此如果您未曾用过 Amazon EMR,请使用以下命令创建默认角色:

    aws emr create-default-roles
  3. 使用 emr-4.7.0 版创建一个 Amazon EMR 集群,以便使用以下 AWS CLI emr create-cluster 命令转换数据:

    export REGION=us-west-1 export SAMPLEURI=s3://${REGION}.elasticmapreduce/samples/hive-ads/tables/impressions/ export S3BUCKET=myBucketName aws emr create-cluster --applications Name=Hadoop Name=Hive Name=HCatalog \ --ec2-attributes KeyName=myKey,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-mySubnetId \ --service-role EMR_DefaultRole --release-label emr-4.7.0 --instance-type \m4.large --instance-count 1 --steps Type=HIVE,Name="Convert to Parquet",\ ActionOnFailure=CONTINUE, ActionOnFailure=TERMINATE_CLUSTER, Args=[-f, \s3://athena-examples/conversion/write-parquet-to-s3.q,-hiveconf, INPUT=${SAMPLEURI},-hiveconf, OUTPUT=s3://${S3BUCKET}/myParquet,-hiveconf, REGION=${REGION} ] \ --region ${REGION} --auto-terminate

    有关更多信息,请参阅 Amazon EMR 管理指南中的为 Amazon EMR 创建和使用 IAM 角色

    成功的请求会让您获得集群 ID。

  4. 通过使用 AWS 管理控制台或通过在 AWS CLI 中将集群 ID 与 list-steps 子命令结合使用,监控集群的进度:

    aws emr list-steps --cluster-id myClusterID

    查找脚本步骤状态。如果它是 COMPLETED,那么转换完成后,您可以随时查询数据。

  5. 创建与您在 EMR 集群上创建的表相同的表。

    您可以使用与上面相同的语句。登录 Athena 并在 Query Editor (查询编辑器) 窗口中输入语句:

    CREATE EXTERNAL TABLE parquet_hive ( requestBeginTime string, adId string, impressionId string, referrer string, userAgent string, userCookie string, ip string ) STORED AS PARQUET LOCATION 's3://myBucket/myParquet/';

    选择 Run Query

  6. 运行以下查询以显示您可以查询此数据:

    SELECT * FROM parquet_hive LIMIT 10;

    此外,您还可以在 Catalog 中选择表名称旁边的查询 (眼睛) 图标。

    结果应与以下输出类似: