1

Hiveテーブルを作成したHDFScsvに暗号化されたデータがあり、最初にクエリパラメータを暗号化してからルックアップを実行するHiveクエリを実行したいと思います。次のように暗号化を行うUDFがあります。

public class ParamEncrypt extends UDF {

public Text evaluate(String name) throws Exception {

    String result = new String();

    if (name == null) { return null; }

    result = ParamData.encrypt(name);

    return new Text(result);
}
}

次に、Hiveクエリを次のように実行します。

select * from cc_details where first_name = encrypt('Ann');

問題は、テーブル内のすべてのレコードに対してencrypt('Ann')が実行されていることです。暗号化を1回行ってから、対戦を行います。私はもう試した:

select * from cc_details where first_name in (select encrypt('Ann') from cc_details limit 1);

ただし、Hiveはwhere句でINまたはselectクエリをサポートしていません。

私に何ができる?

私は次のようなことをすることができますか?

select encrypt('Ann') as ann from cc_details where first_name = ann;

クエリパーサーがannが既知の列ではないというエラーをスローするため、これも機能しません。

4

3 に答える 3

1

最後に、右外側の結合でそれを取得しました

select * from cc_details ssn_tbl
right outer join ( select encrypt('850-37-8230','ssn') as ssn 
    from cc_details limit 1) ssn_tmp
on (ssn_tbl.ssn = ssn_tmp.ssn);
于 2012-10-18T03:21:57.960 に答える
0

それを行う別の方法(そして実際に私が行った方法)は、暗号化の結果をキャッシュすることです。結合すると、別のmap-reduceジョブのセットが得られ、全体の実行時間が遅くなるため、実際にはこの方法の方が高速です。

こんな感じです:

private static String result = null;

public Text evaluate(String data) {
    if (result ==  null) {
        result = Data.encrypt(data);
    }
    return new Text(result);
}
于 2012-10-21T00:08:44.543 に答える
0

あなたが探しているのは@UDFType(deterministic = true)UDFの注釈だと思います。Generic UDFで確実に利用可能であり、作成したような通常のUDFで利用可能かどうかを確認できます。そうでない場合は、UDFをGenericUDFに変換するだけです。しばらく前に書いたこのブログ投稿でそれについて読むことができます。

于 2012-10-19T04:49:30.140 に答える