2

このハイブ クエリを使用して、すべてのアカウントの国コードを検出しています。問題は、結合によってデータ セットが管理不能なサイズに爆発し、場合によってはジョブの完了に失敗することです。

この 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

BETWEENHive は内部ON節をサポートしていません。また、WHEREフィルタは結合が完了した後にのみ適用されます。どんなヒントも役に立ちます。現在、カスタム MapReduce ジョブを使用してこれを解決しようとしています。誰にもアイデアはありますか?

情報

  • geoipテーブルのサイズは約1MBです
  • Hadoop クラスタには 12 のマップ スロットと 12 のリデュース スロットしかありません
  • begin_ip_num最初のオクテット (例: 123of ) に基づいて geoip テーブルをバケット化し、句のような123.0.0.0条件を使用しようとしました。一部の行が除外されるため、この手法は機能しません。JOINFROM 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

今のところ、それは簡単な解決策ではないと思います。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 FROM data d OUTER APPLY (SELECT TOP 1 FROM geoip g WHERE d.ip_num BETWEEN g.begin_ip_num AND g.end_ip_num ) i

敬礼

于 2013-02-26T16:14:10.570 に答える