我有两张桌子。
表一个包含
userid gameid starttimestamp endtimestamp
表二包含
userid actiontimestamp someaction
给定用户 ID 和游戏 ID,我想看看每个游戏 ID 中有多少动作。鉴于只允许 equi join,将它们连接在一起的有效方法是什么?
我的大多数交叉连接和过滤尝试最终都导致映射器和减速器卡在 100%。
您可以在 WHERE 子句中处理所有“theta join”(非等值连接)条件。像这样:
SELECT * FROM OrderLineItem li LEFT OUTER JOIN ProductPrice p ON p.ProductID = li.ProductID
WHERE (p.StartDate IS NULL AND p.EndDate IS NULL)
OR li.OrderDate BETWEEN p.StartDate AND p.EndDate;
当然,此示例假定 StartDate 和 EndDate 都是 ProductPrice 的不可为空的列。
非 equi 连接在 Hive 中不可用。
为了优化 equi 连接,您可以尝试以下操作。
1.您可以在Hive中实现Buckets 。
2.也阅读这篇facebook 文章 。
3.你有不止一项工作吗?如果有,在hive中启用并行执行。如果您的工作是独立的,它们会并行运行。
4.如果其中一张表很小,请在配置单元中使用带有添加文件选项的分布式缓存。