我尝试使用emr在按日期分区的外部表上运行查询,其中 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'
我创建了一个简单的脚本,将结果插入到我的s3 bucket中,用tab分隔并用gzip压缩。
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;
我在配置单元控制台上通过替换 ${OUTPUT}, {:start_date}
以及 {:start_date-1}
参数的值和它的工作很好,我可以看到结果压缩,并在我的s3输出桶标签分开。
现在,我想以编程方式为去年的数据运行这个脚本。如何将日期参数传递到emr步骤?我看到emr上有一个arguments部分,但我猜是针对emr集群的配置参数的。
还有,会不会 {:start_date-1}
为我的日期格式工作,还是需要将字符串date解析为日期,减去一天,然后再次将其解析为字符串?
我计划创建一个python脚本,它接受一系列日期,并将每个步骤提交给一个长期运行的emr集群,但我不知道如何将日期作为参数传递,而且我也找不到任何关于如何轻松实现这一点的教程。
1条答案
按热度按时间cngwdvgl1#
要将参数传递给emr配置单元作业,请执行以下操作之一:
在emr step web控制台中
添加
即
在emr步骤参数部分
或者在aws cli中,在args部分中添加参数。即:
更多:
https://docs.aws.amazon.com/cli/latest/reference/emr/add-steps.html