hiveql-大数据的高效geoip发现

pexxcrt2  于 2021-06-03  发布在  Hadoop
关注(0)|答案(4)|浏览(306)

我正在使用此配置单元查询来发现所有帐户的国家/地区代码。问题是连接将数据集扩展到无法管理的大小,甚至有时作业也无法完成。
什么是一种快速有效的方法来完成这个geoip查找查询?不强制使用配置单元

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

配置单元不支持 BETWEEN 内部 ON 条款。此外,还有 WHERE 筛选器仅在联接完成后应用。任何提示都是有用的。我目前正试图解决这个使用自定义mapreduce作业。有人有什么想法吗?

信息 geoip 表的大小约为1mb

hadoop集群只有12个map槽和12个reduce槽
我试着根据 begin_ip_num 第一个八位字节(例如 123123.0.0.0 ),然后使用 JOIN 从句式 FROM data JOIN geoip ON (data.first_octet_bucket=geoip.first_octet_bucket) . 此技术不起作用,因为某些行将被忽略。

5jdjgkvh

5jdjgkvh1#

尝试下推。
打开文件:

$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

r6hnlfcb

r6hnlfcb2#

最终选择的解决方案是绕过Hive。我们将geoip表序列化为一个常规的javatreemap,并使用hadoop的distributedcache将其上传到自定义Map器。

q3qa4bjr

q3qa4bjr3#

从数据d outer apply中选择d.account\ id、d.a、d.b、d.c、i.country\ U code(从geoip g中选择top 1,其中d.ip\ num介于g.begin\ U ip\ num和g.end\ U ip\ num之间)
敬礼

5us2dqdw

5us2dqdw4#

我想现在这不是简单的解决办法。无非等连接支持s#c#s。这里有一些解决办法https://reviews.facebook.net/d4137 . 顺便说一句,祝你好运。

相关问题