2

我正在使用此配置单元查询来发现所有帐户的国家代码。问题是连接将数据集爆炸到无法管理的大小,甚至有时作业也无法完成。

完成此 geoip 查找查询的快速有效方法是什么?使用 Hive 不是强制性的

SELECT /*+ MAPJOIN(geoip) */
  data.account_id, geoip.country_code
FROM data JOIN geoip
WHERE data.ip_num BETWEEN geoip.begin_ip_num AND geoip.end_ip_num

Hive 不支持BETWEENinsideON子句。此外,WHERE过滤器仅在连接完成后应用。任何提示也会很有用。我目前正在尝试使用自定义 MapReduce 作业来解决此问题。有人有什么想法吗?

信息

  • geoip表大小约为 1MB
  • Hadoop集群只有12个map slot和12个reduce slot
  • 我试图根据第begin_ip_num一个八位位组(例如:123of 123.0.0.0)存储 geoip 表,然后使用JOIN子句中的条件,例如FROM data JOIN geoip ON (data.first_octet_bucket=geoip.first_octet_bucket). 此技术不起作用,因为某些行将被遗漏。
4

4 回答 4

2

最终选择的解决方案是绕过 Hive。我们将 geoip 表序列化为常规 java TreeMap,并使用 Hadoop 的 DistributedCache 将其上传到自定义映射器。

于 2013-03-11T14:24:24.590 回答
1

尝试启用谓词下推。

打开文件:

 $HIVE_CONF_DIR/hive-site.xml

添加:

<property>
  <name>hive.optimize.ppd to true</name>
  <value>false</value>
  <description>Whether to enable predicate pushdown</description>
</property>

参考: PredicatePushDown.html

于 2013-03-07T20:14:34.617 回答
0

我想这不是现在简单的解决方案。没有非 equi 连接支持 s#c#s。这是一些解决方案https://reviews.facebook.net/D4137。顺便说一句,祝你好运。

于 2013-02-26T19:08:05.280 回答
-2

SELECT d.account_id,da,db,dc,i.country_code 从数据 d 外部应用(从 geoip g 中选择 TOP 1,其中 d.ip_num 在 g.begin_ip_num 和 g.end_ip_num 之间)我

礼炮

于 2013-02-26T16:14:10.570 回答