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.0123)对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 发现的主要内容,如果未能解决你的问题,请参考以下文章

培训回顾 | 数据仓库迁移大数据平台及HiveQL基础培训

大数据分析工程师面试集锦3-SQL/SparkSql/HiveQL

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

Django博客来访人员地域分布大数据可视化---echarts绘图geoip2获取地理位置

大数据——Hive(数据仓库工具)

开发一个不需要重写成Hive QL的大数据SQL引擎