将Hive参数传递给EMR步骤

时间:2019-05-14 14:36:39

标签: amazon-web-services hive hiveql amazon-emr

我正在尝试使用EMR对按日期分区的EXTERNAL表运行查询,其中dt分区的格式为YYYYmmdd i.e: 20190121

CREATE EXTERNAL TABLE `my_schema`.`tracking_table`(
  `id` string,
  `active_bitmap` string)
PARTITIONED BY (
  `dt` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
  'quoteChar'='\"',
  'separatorChar'='\t')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket/trackingtable'

我创建了一个简单的脚本,将结果(由制表符分隔并以gzip压缩)插入到S3存储桶中。

set hive.cli.print.header=true;
set mapred.output.compress=true;
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec;

INSERT OVERWRITE DIRECTORY '${OUTPUT}/dt={:start_date}/'
select if(b.id is null,a.id,b.id) as id
       ,if(b.days_active is null, 1, (shiftleft(CAST(b.days_active AS BIGINT),1))|if(a.is_active is null,0,1) ) as active_bitmap
       ,'{:start_date}' as dt_partition
from(
    select id,
    if(count(1) > 0, 1, NULL) as is_active
    from my_schema.activity_table where dt='{:start_date}' group by id
)a
full outer join(
    select * from my_schema.tracking_table where dt='{:start_date-1}'
)b on a.id=b.id;

我在HIVE控制台上测试了脚本,方法是将${OUTPUT}, {:start_date}{:start_date-1}参数替换为值,并且工作正常,我可以在S3输出存储桶中看到由选项卡压缩和分离的结果。 / p>

现在,我想以编程方式针对去年的数据运行此脚本。如何将date参数传递给我的EMR步骤?我看到在EMR上有一个参数部分,但我想这是关于EMR集群的配置参数的。

此外,{:start_date-1}是否适用于我的日期格式,还是我需要将字符串日期解析为日期,减去一天然后再次解析为字符串?

我正计划创建一个需要一定日期范围的python脚本,并将每个步骤提交给长期运行的EMR集群,但是我不知道如何将日期作为参数传递,并且我找不到任何教程关于如何轻松做到这一点。

1 个答案:

答案 0 :(得分:0)

将参数传递给EMR HIVE作业之一:

在EMR Step Web控制台中

添加

-d parameter1 -d parameter2

-d dt=20190101 -d dt2=20190201

在“ EMR步骤参数”部分中

或在AWS CLI中,在ARGS部分中添加参数。即:

aws emr add-steps --cluster-id j-xxxxx --steps Type=HIVE,Name='Hive Job Name XXX',ActionOnFailure=CONTINUE,Args=[-f,s3://bucket/folder/,-d,INPUT=s3://bucket/folder/input/,-d,OUTPUT=s3://s3://bucket/folder/output/,-d,dt=20190101,-d,dt2=20190201]

更多:

https://docs.aws.amazon.com/cli/latest/reference/emr/add-steps.html