amazon-web-services - 将压缩 (lzo) 数据从 s3 导入配置单元

标签 amazon-web-services hive elastic-map-reduce emr lzo

我将我的 DynamoDB 表导出到 s3 作为备份方式(通过 EMR)。导出时,我将数据存储为 lzo 压缩文件。我的配置单元查询在下面,但基本上我遵循了“使用数据压缩将 Amazon DynamoDB 表导出到 Amazon S3 存储桶”在 http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/EMR_Hive_Commands.html

我现在想反其道而行之 - 获取我的 LZO 文件并将它们放回配置单元表中。你怎么做到这一点?我期待看到一些 hive configuration property用于输入,但没有。我用谷歌搜索并找到了一些提示,但没有确定的,也没有任何有效的。

s3 中的文件格式为:s3://[mybucket]/backup/year=2012/month=08/day=01/000000.lzo

这是我执行导出的 HQL:

SET dynamodb.throughput.read.percent=1.0;
SET hive.exec.compress.output=true;
SET io.seqfile.compression.type=BLOCK;
SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec;      

CREATE EXTERNAL TABLE hiveSBackup (id bigint, periodStart string, allotted bigint, remaining bigint, created string, seconds bigint, served bigint, modified string)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "${DYNAMOTABLENAME}", 
"dynamodb.column.mapping" = "id:id,periodStart:periodStart,allotted:allotted,remaining:remaining,created:created,seconds:seconds,served:served,modified:modified");

CREATE EXTERNAL TABLE s3_export (id bigint, periodStart string, allotted bigint, remaining bigint, created string, seconds bigint, served bigint, modified string)
 PARTITIONED BY (year string, month string, day string)
 ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
 LOCATION 's3://<mybucket>/backup';

INSERT OVERWRITE TABLE s3_export
 PARTITION (year="${PARTITIONYEAR}", month="${PARTITIONMONTH}", day="${PARTITIONDAY}")
 SELECT * from hiveSBackup;

关于如何从 s3 获取它、解压缩并放入 hive 表的任何想法?

最佳答案

EMR 上的 Hive 可以直接从 S3 本地读取数据,您无需导入任何内容。您只需创建一个外部表并告诉它数据在哪里。 它还具有 lzo 支持设置。如果文件以 .lzo 扩展名结尾,Hive 将使用 lzo 自动解压缩。

因此,要将 s3 中的 lzo 数据“导入”到 hive 中,您只需创建一个指向 lzo 压缩数据 s3 的外部表,hive 就会在对其运行查询时对其进行解压缩。几乎与您“导出”数据时所做的完全一样。那个 s3_export 表,你也可以从中读取。

如果要导入到非外部表中,只要insert overwrite到一个新表中,从外部表中select即可。

除非我误解了您的问题,而您的意思是要询问有关导入发电机的问题,而不仅仅是一个配置单元表?

This is what I've been doing
SET hive.exec.compress.output=true; 
SET io.seqfile.compression.type=BLOCK;
SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec;

CREATE EXTERNAL TABLE users
(id int, username string, firstname string, surname string, email string, birth_date string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION 's3://bucket/someusers';

INSERT OVERWRITE TABLE users
SELECT * FROM someothertable;

我最终在 s3://bucket/someusers 下得到了一堆扩展名为 .lzo 的文件,这些文件可以被 hive 读取。

您只需要在尝试写入压缩数据时设置编解码器,读取它就会自动检测到压缩。

关于amazon-web-services - 将压缩 (lzo) 数据从 s3 导入配置单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11906170/

相关文章:

apache - 如何使用域地址直接访问部署在 AWS tomcat 中的 Web 应用程序?

java - bin/hive 给出错误问题

amazon-web-services - Hive-在文件之间拆分数据

linux - 指向 Amazon Linux AMI 测试页面而不是 WP 站点的 AWS EC2 实例

amazon-web-services - 从 t1.micro 迁移到 t2.micro 亚马逊 AWS

linux - 如何在 Chef Opscode 中使用幂等性仅执行一次挂载资源?

hadoop - 我在 hive 中有n(大量)个小型txt文件

hadoop - Hive 解析和编辑数组以构造字段

hadoop - 如何以0.0164的价格竞价现货实例

java - 用于获取 AWS EMR 中任务实例组实例计数的 API