【问题标题】:Hadoop and hive optimisationHadoop 和 Hive 优化
【发布时间】:2015-12-27 09:49:33
【问题描述】:

我需要以下情况的帮助:

1) 备注表是hive中的源表。 它有5493656359条记录。它的描述如下:

load_ts timestamp
memo_ban bigint
memo_id bigint
sys_creation_date timestamp
sys_update_date timestamp
operator_id bigint
application_id varchar(6)
dl_service_code varchar(5)
dl_update_stamp bigint
memo_date timestamp
memo_type varchar(4)    
memo_subscriber varchar(20)
memo_system_txt varchar(180)
memo_manual_txt varchar(2000)
memo_source varchar(1)
data_dt string
market_cd string

Partition information:
data_dt string
market_cd string

2)

这是目标表

CREATE TABLE IF NOT EXISTS memo_temprushi (
load_ts TIMESTAMP,
ban BIGINT,
attuid BIGINT, 
application VARCHAR(6),
system_note INT,
user_note INT, 
note_time INT, 
date TIMESTAMP)
PARTITIONED BY (data_dt  STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");

3)

这是从源表 Memo 到的初始加载语句 目标表 memo_temprushi。加载截至日期 2015-12-14 的所有记录:

SET hive.exec.compress.output=true;
SET mapred.output.compression.type=BLOCK;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
INSERT INTO TABLE memo_temprushi PARTITION (DATA_DT)
SELECT LOAD_TS,MEMO_BAN, OPERATOR_ID, APPLICATION_ID,
CASE WHEN LENGTH(MEMO_SYSTEM_TXT)=0 THEN 0 ELSE 1 END,
CASE WHEN LENGTH(MEMO_MANUAL_TXT)=0 THEN 0 ELSE 1 END,
HOUR(MEMO_DATE), MEMO_DATE, DATA_DT 
FROM tlgmob_gold.MEMO WHERE LOAD_TS < DATE('2015-12-15');

4)

对于增量加载,我想插入其余记录,即从 2015-12-15 日期开始。我正在使用以下查询:

INSERT INTO TABLE memo_temprushi PARTITION (DATA_DT) 
SELECT MS.LOAD_TS,MS.MEMO_BAN, MS.OPERATOR_ID, MS.APPLICATION_ID, 
CASE WHEN LENGTH(MS.MEMO_SYSTEM_TXT)=0 THEN 0 ELSE 1 END, 
CASE WHEN LENGTH(MS.MEMO_MANUAL_TXT)=0 THEN 0 ELSE 1 END, 
HOUR(MS.MEMO_DATE), MS.MEMO_DATE, MS.DATA_DT 
FROM tlgmob_gold.MEMO MS JOIN (select max(load_ts) max_load_ts from memo_temprushi) mt 
ON 1=1 
WHERE 
ms.load_ts > mt.max_load_ts;

它启动了 2 个作业。最初,它给出了关于 stage 是交叉产品的警告。 第一份工作很快就完成了,但第二份工作仍然停留在减少 33%。 日志显示:[EventFetcher for fetching Map Completion Events] org.apache.hadoop.mapreduce.task.reduce.EventFetcher: EventFetcher is interrupted.. Returning 它表明减速器的数量为1。 试图通过这个命令集 mapreduce.job.reduces 增加 reducer 的数量,但它不起作用。

谢谢

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    你可以试试这个。

    • 运行“从 memo_temprushi 中选择 max(load_ts) max_load_ts”
    • 在查询的 where 条件中添加值并删除查询的连接条件。

    如果可行,那么您可以开发 shell 脚本,其中第一个查询将获得最大值,然后运行第二个查询而不连接。

    这是示例 shell 脚本。

    max_date=$(hive -e "select max(order_date) from orders" 2>/dev/null)
    
    hive -e "select order_date from orders where order_date >= date_sub('$max_date', 7);"
    

    【讨论】:

    • 嗨,尝试执行以下给定查询: max_date=$(hive –e “select max(load_ts) from sandbox37.memo_tempbhanu;”) hive –e “select count(*) from tlgmob_gold.memo其中 load_ts > date('$max_date');”查询正在执行,没有任何错误。但是,尽管备忘录表中存在记录,但将记录计数为零。
    • 无需申请日期功能
    • 没有日期函数,会抛出类型转换异常。
    • 你能粘贴select max(load_ts) from sandbox37.memo_tempbhanu;和select max(load_ts) from tlgmob_gold.memo的输出吗?
    • 应该是:max_date=$(hive -S –e "set hive.cli.print.header=false; select cast(max(load_ts) as string) from sandbox37.memo_tempbhanu;”)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多