bri*_*isk 4 hadoop hive amazon-web-services emr amazon-ami
我使用AWS-EMR来运行我的Hive查询,并且在运行hive版本0.13.1时出现性能问题.
较新版本的hive运行10行数据大约需要5分钟.但230804行的相同脚本需要2天才能运行.我该怎么做才能分析并解决问题?
样本数据:
表格1:
hive> describe foo;
OK
orderno string
Time taken: 0.101 seconds, Fetched: 1 row(s)
Run Code Online (Sandbox Code Playgroud)
table1的示例数据:
hive>select * from foo;
OK
1826203307
1826207803
1826179498
1826179657
Run Code Online (Sandbox Code Playgroud)
表2:
hive> describe de_geo_ip_logs;
OK
id bigint
startorderno bigint
endorderno bigint
itemcode int
Time taken: 0.047 seconds, Fetched: 4 row(s)
Run Code Online (Sandbox Code Playgroud)
表2的样本数据:
hive> select * from bar;
127698025 417880320 417880575 306
127698025 3038626048 3038626303 584
127698025 3038626304 3038626431 269
127698025 3038626560 3038626815 163
Run Code Online (Sandbox Code Playgroud)
我的查询:
SELECT b.itemcode
FROM foo a, bar b
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno;
Run Code Online (Sandbox Code Playgroud)

在Hive日志输出的最顶部,它表示"警告:随机加入JOIN [4] [表格a,b]在舞台'Stage-1 Mapred'中是一个交叉产品."
编辑:"交叉产品"或笛卡尔积是无条件的连接,它返回'b'表中的每一行,对于'a'表中的每一行.因此,如果你举一个例子'a'是5行,'b'是10行,你得到的产品,或者,5乘以10 = 50行返回.对于一个或另一个表,将有很多行完全为"空".
现在,如果你有一个20,000行的表'a'并将它连接到500,000行的另一个表'b',你要求SQL引擎返回一个10,000,000,000行的数据集'a,b',然后在1000万行上执行BETWEEN操作.
所以,如果你删除'b'行的数量,你会发现你会获得比'a'更多的好处 - 在你的例子中,如果你可以过滤ip_logs表,表2,因为我猜它有比您的订单号表更多的行,它将减少执行时间.结束编辑
您通过不指定连接条件来强制执行引擎处理笛卡尔积.它必须一遍又一遍地扫描所有表格.有10行,你就不会有问题.有了20k,你就会遇到几十个map/reduce wave.
试试这个查询:
SELECT b.itemcode
FROM foo a JOIN bar b on <SomeKey>
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno;
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚你的模型允许加入哪一列.也许这个表达式的数据模型可以改进?可能只是我没有清楚地阅读样本.
无论哪种方式,您都需要在where子句之前过滤比较次数.我在Hive中完成此操作的其他方法是使用较小的数据集创建视图,并加入/匹配视图而不是原始表.
| 归档时间: |
|
| 查看次数: |
4852 次 |
| 最近记录: |