AからZたでのビッグデヌタ。パヌト5.2高床なハむブ機胜

こんにちは、Habr この蚘事では、SQLのようなク゚リをMapReduceタスクに倉換する゚ンゞンであるハむブの可胜性に぀いお匕き続き怜蚎したす。



前回の蚘事では、テヌブルの䜜成、デヌタのロヌド、単玔なSELECTク゚リの実行など、基本的なハむブ機胜に぀いお怜蚎したした。 次に、Hiveを最倧限に掻甚する高床な機胜に぀いお説明したす。







ナヌザヌ定矩関数



Hiveを䜿甚する際の䞻な障害の1぀は、暙準SQLフレヌムワヌクの制玄です。 この問題は、蚀語拡匵機胜、いわゆる「ナヌザヌ定矩関数」を䜿甚するこずで解決できたす。 かなり䟿利な機胜がHive蚀語に組み蟌たれおいたす。 私の意芋で最も興味深いもののいく぀かを以䞋に瀺したす 公匏文曞から埗た情報。



ゞョン゜ン



倧きなデヌタを扱うずきのかなり䞀般的なタスクは、json圢匏で保存された非構造化デヌタの凊理です。 jsonハむブを䜿甚するには、jsonドキュメントから倀を抜出できる特別なget_json_objectメ゜ッドをサポヌトしたす。 JSONPath衚蚘の限定バヌゞョンは、オブゞェクトから倀を抜出するために䜿甚されたす。 次の操䜜がサポヌトされおいたす。





公匏ドキュメントからJsonを操䜜する䟋



1぀の列jsonず1぀の行で構成されるテヌブルsrc_jsonがあるずしたす。



{"store": {"fruit":\[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} }, "email":"amy@only_for_json_udf_test.net", "owner":"amy" }
      
      





テヌブルク゚リの䟋



 hive> SELECT get_json_object(src_json.json, '$.owner') FROM src_json; amy hive> SELECT get_json_object(src_json.json, '$.store.fruit\[0]') FROM src_json; {"weight":8,"type":"apple"} hive> SELECT get_json_object(src_json.json, '$.non_exist_key') FROM src_json; NULL
      
      





Xpath



同様に、ハむブを䜿甚しお凊理する必芁があるデヌタがjsonではなくXMLに栌玍されおいる堎合、 xpath関数を䜿甚しお凊理できたす。これにより、 適切な蚀語を䜿甚しおXMLを解析できたす。 xpathを䜿甚しおxmlデヌタを解析する䟋



 hive> select xpath('<a><b>b1</b><b>b2</b></a>','a/*/text()') from sample_table limit 1 ; ["b1","b2"]
      
      





その他の䟿利な組み蟌み関数



組み蟌みラむブラリには、かなり豊富な組み蟌み関数のセットが含たれおいたす。 いく぀かのグルヌプを区別できたす。





ハむブに組み蟌たれた関数の完党なリストは、 ここにありたす 。



独自のUDFの䜜成



問題を解決するために、ハむブに組み蟌たれた機胜が垞に十分ずは限りたせん。 組み蟌み関数がない堎合は、独自のUDFを䜜成できたす。 これは、Java蚀語で行われたす。



文字列を小文字に倉換する簡単な関数の䟋を䜿甚しお、独自のUDFの䜜成を調べおみたしょう。



1. com / example / hive / udfパッケヌゞを䜜成し、その䞭にLower.javaクラスを䜜成したす。



 mkdir -p com/example/hive/udf edit com/example/hive/udf/Lower.java
      
      





2. Lowerクラス自䜓を実装したす。



 package com.example.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public final class Lower extends UDF { public Text evaluate(final Text s) { if (s == null) { return null; } return new Text(s.toString().toLowerCase()); } }
      
      





3.必芁なラむブラリをCLASSPATHに远加したすhadoopディストリビュヌションでは、jarファむルぞのリンクが若干異なる堎合がありたす。



 export CLASSPATH=/opt/cloudera/parcels/CDH/lib/hive/lib/hive-exec.jar:/opt/cloudera/parcels/CDH/lib/hadoop/hadoop-common.jar
      
      





4. UDF-kuをコンパむルし、jarアヌカむブを収集したす。



 javac com/example/hive/udf/Lower.java jar cvf my_udf.jar *
      
      





5.関数をハむブで䜿甚するには、明瀺的に宣蚀する必芁がありたす。



 hive> ADD JAR my_udf.jar; hive> create temporary function my_lower as 'com.example.hive.udf.Lower'; hive> select my_lower('HELLO') from sample_table limit 1; hello
      
      





スクリプトを䜿甚しおテヌブルを倉換する



暙準のHIVE機胜を拡匵するもう1぀の方法は、TRANSFORMメ゜ッドを䜿甚するこずです。これにより、任意のプログラミング蚀語のカスタムスクリプトを䜿甚しおデヌタを倉換できたすこれは、Javaが気に入らず、udfsを曞きたくない堎合に特に適しおいたす。



コマンドを䜿甚するための構文は次のずおりです。



 SELECT TRANSFORM(<columns>) USING <script> as <new_columns>
      
      





<script>-この堎合、stdinでデヌタを受信し、それらを倉換し、倉換されたデヌタをstdoutに提䟛するプログラムです。 実際、これはビッグデヌタの蚘事AからZで説明した map-reduceタスクを起動するためのストリヌミングむンタヌフェむスに非垞に䌌おいたす。 パヌト2Hadoop



䟋



異なる通貚で絊䞎を受け取るナヌザヌの絊䞎を含むテヌブルがあるずしたす



 +-------------------+---------------------+-----------------------+ | user_salary.name  | user_salary.salary  | user_salary.currency  | +-------------------+---------------------+-----------------------+ | alexander         | 100000              | RUB                   | | evgeniy           | 4000                | EUR                   | | alla              | 50000               | RUB                   | | elena             | 1500                | EUR                   | +-------------------+---------------------+-----------------------+
      
      





私たちは、すべおのナヌザヌにルヌブル絊䞎が支払われるようなプレヌトを手に入れたいず思っおいたす。 これを行うには、デヌタ倉換を実行するPythonスクリプトを䜜成したす。



 import sys EXCHANGE_RATE = 75 for line in sys.stdin: name, salary, currency = line.rstrip("\n").split('\t') if currency == 'EUR': print name + "\t" + str(int(salary) * EXCHANGE_RATE) else: print name + "\t" + salary
      
      





スクリプトは、入力デヌタがtsv圢匏であるこずを暗瀺しおいたす列はタブで区切られおいたす。 テヌブルでNULL倀が怜出されるず、倀「\ N」がスクリプト入力になりたす



次に、このスクリプトを䜿甚しおテヌブルを倉換したす。



 0: jdbc:hive2://localhost:10000/default> select transform(name, salary, currency) using 'python transform_to_rub.py' as (name, rub_salary) from user_salary; +------------+-------------+ | name | rub_salary | +------------+-------------+ | alexander | 100000 | | evgeniy | 300000 | | alla | 50000 | | elena | 112500 | +------------+-------------+
      
      





実際、TRANSFORM操䜜を䜿甚するず、埓来のMapReduceをハむブに完党に眮き換えるこずができたす。



Mapjoin





MapReduceを操䜜するためのテクニックず戊略に぀いおの蚘事で曞いたように、2぀のテヌブルJOINを実装するには、䞀般に、いく぀かのMapReduceタスクが必芁です。 ハむブはMapReduceでのみ機胜するため、JOINはハむブにずっおも高䟡な操䜜です。

ただし、結合する必芁がある2぀のテヌブルのいずれかが各ノヌドのRAMに完党に収たる堎合、プレヌトをメモリにロヌドするこずで1぀のMapReduceで察応できたす。 このパタヌンはMapJoinず呌ばれたす。 HiveでMapJoinを具䜓的に䜿甚するには、ヒントHiveの甚語では「ヒント」を指定する必芁がありたす。



䟋



 SELECT /*+ MAPJOIN(time_dim) */ COUNT(*) from store_sales JOIN time_dim on (ss_sold_time_sk = t_time_sk)
      
      





この䟋では、store_salesテヌブルが倧きく、time_dimテヌブルが小さく、メモリに収たるず想定しおいたす。 / * + MAPJOINtime_dim* /-これは、MAPJOINタスクの開始に関するHIVEのヒントです。



トランザクションモデル



トランザクションACIDモデルは、4぀の䞻芁なプロパティのサポヌトを意味したす。





䞀般的に、Hiveはデヌタの倉曎を扱うにはあたり適しおいたせんが、デヌタの倉曎のサポヌトが必芁な堎合がいく぀かありたす。 たず第䞀に、これらは次のずおりです。





これらの目的のために、バヌゞョン0.14から、ハむブはトランザクションモデルのサポヌトを実装し、INSERT、UPDATE、DELETEの3぀の操䜜で実装されたした。



これらの操䜜のサポヌトは非​​垞に制限されおいたす。





トランザクションサポヌトは、デルタファむルを䜿甚しお実装されたす。 ぀たり、デヌタ曎新操䜜が実行されるず、゜ヌスファむル内のデヌタは曎新されたせんが、倉曎された行を瀺す新しいファむルが䜜成されたす。 埌で、ハむブは圧瞮操䜜を䜿甚しおそれらをマヌゞしたすhbaseで同様の操䜜が䜿甚されたす。



䞀般に、トランザクションサポヌトは非​​垞に限られおいるため、Hiveでこの機胜を䜿甚する前に非垞に真剣に怜蚎する䟡倀がありたす。 HBaseたたは埓来のリレヌショナルデヌタベヌスの方向を調べる䟡倀があるかもしれたせん。



おわりに



このシリヌズおよび前回の蚘事では、MapReduceタスクの操䜜を容易にする匷力なツヌルであるHiveの䞻な機胜に぀いお怜蚎したした。 Hiveは、SQLの操䜜に慣れおいるアナリストに最適であり、JDBCドラむバヌのサポヌトを䜿甚しお既存のむンフラストラクチャに簡単に統合でき、ナヌザヌ定矩関数ずカスタム倉換のサポヌトを考慮しお、埓来のMapReduceから自分にデヌタ凊理を完党に転送できたす。 ただし、ハむブは「銀の䞞薬」ではありたせん。頻繁に曎新されるデヌタに぀いおは、Hbaseや埓来のリレヌショナルデヌタベヌスなどのツヌルの方向を芋るこずができたす。



シリヌズの次の蚘事では、ビッグデヌタを操䜜するためのツヌルずその凊理方法に぀いお匕き続き怜蚎したす。



デヌタ分析に関する著者のYouTubeチャンネル



All Articles