HiveQL - 大数据的高效 geoip 发现
Posted
技术标签:
【中文标题】HiveQL - 大数据的高效 geoip 发现【英文标题】:HiveQL - Efficient geoip discovery for big data 【发布时间】:2013-02-26 16:07:27 【问题描述】:我正在使用此配置单元查询来发现所有帐户的国家/地区代码。问题是连接将数据集爆炸到无法管理的大小,甚至有时作业无法完成。
什么是完成这个 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 不支持 BETWEEN
内的 ON
子句。此外,WHERE
过滤器仅在连接完成后应用。任何提示也会很有用。我目前正在尝试使用自定义 MapReduce 作业来解决此问题。有人有什么想法吗?
信息
geoip
表大小约为 1MB
Hadoop 集群只有 12 个 map 槽和 12 个 reduce 槽
我尝试根据begin_ip_num
第一个八位字节(例如:123.0.0.0
的123
)对geoip 表进行存储桶,然后使用JOIN
子句中的条件,如FROM data JOIN geoip ON (data.first_octet_bucket=geoip.first_octet_bucket)
。此技术不起作用,因为某些行会被遗漏。
【问题讨论】:
您是在 Hive 中寻找解决方案还是在使用纯 HiveQL ? 【参考方案1】:最终选择的解决方案是绕过 Hive。我们将 geoip 表序列化为常规 java TreeMap,并使用 Hadoop 的 DistributedCache 将其上传到自定义映射器。
【讨论】:
谢谢!与我之前尝试过的另一半解决方案相比,它的速度非常快 @beefyhalo,您能否向我们指出任何描述如何更详细地执行此操作的资源? 一年后,我们使用了 maxmind java api 和 maxmind 网站提供的二进制 GeoIp.dat 文件【参考方案2】:尝试启用谓词下推。
打开文件:
$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
【讨论】:
【参考方案3】:我想这不是一个简单的解决方案。没有非 equi 连接支持 s#c#s。这是一些解决方案https://reviews.facebook.net/D4137。顺便说一句,祝你好运。
【讨论】:
是的,我认为没有一种简单的方法可以转换为等价的非等价连接。目前,我正在尝试编写一个自定义 MapReduce 脚本来解决这个问题【参考方案4】:选择 d.account_id,d.a,d.b,d.c,i.country_code FROM 数据 外用 (选择 前1名 来自 geoip g d.ip_num 在 g.begin_ip_num 和 g.end_ip_num 之间 ) 我
敬礼
【讨论】:
以上是关于HiveQL - 大数据的高效 geoip 发现的主要内容,如果未能解决你的问题,请参考以下文章
大数据分析工程师面试集锦3-SQL/SparkSql/HiveQL
Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置