【问题标题】:importing compressed (lzo) data from s3 to hive将压缩(lzo)数据从 s3 导入 hive
【发布时间】:2012-08-10 17:01:18
【问题描述】:

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

上的“使用数据压缩将 Amazon DynamoDB 表导出到 Amazon S3 存储桶”

我现在想做相反的事情 - 将我的 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 表??

【问题讨论】:

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


    【解决方案1】:

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

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

    如果要将其导入非外部表,只需将覆盖插入新表并从外部表中选择即可。

    除非我误解了您的问题并且您的意思是要询问有关导入发电机的问题,而不仅仅是一个蜂巢表?

    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 读取。

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

    【讨论】:

    • 你有一个完整的示例 hql 脚本可以工作吗?我试过你提到的没有成功。我的数据再次被分区。我只是想导入到 hive,而不是 dynamo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2014-01-01
    • 2011-08-11
    相关资源
    最近更新 更多