【ビッグデータ】Java学生入門Hiveプログラミング——概要と入門操作


【一】概要
日常のデータ需要にとって、Hiveを熟知することは必須の技能であり、多くの日常のデータ導出はSparkタスクを必要としないため、1つのHiveQLを走ることで完成することができるが、それを知っていてもその理由を知る目的を持って、まずHiveに関する知識を理解し、それから日常のHiveQLで使用可能な関数を熟知する.
Hiveは、元のデータと変換後のデータの記憶として使用され、ETLを簡略化する.
まず公式のHiveに対する定義を与えます
The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto data already in storage. A command line tool and JDBC driver are provided to connect users to Hive.
この公式定義から、Hiveの次の特性をまとめることができます.
  • SQLに類似するクエリ
  • リレーショナル・データベースの構造をHDFSの
  • にマッピングする.
  • はコマンドラインとJDBC接続
  • を提供する.
    Hiveとデータウェアハウス:
    HiveはHadoop最上階に構築されたデータウェアハウスツールです
    ここでは、データ・ウェアハウスの概念について説明しなければなりません.
  • とリレーショナル・データベースの違い:
  • データベース-インタラクティブクエリー、
  • データウェアハウス-最下位はMapReduceであり、業務ニーズを搭載することができず、複数のデータソースのデータはETLを通じて同じデータウェアハウスに統合される.

  • データウェアハウス内のデータは、
  • の変更、削除を許さない.
    【目的】
    主にMapReduceのプログラミングを容易にするため、ユーザーがSQL文のようにMapReduceのプログラミングを行うのを容易にするため、javaのプログラミング者ではありませんhdfsのデータに対してMapReduceの操作をします
    【Hiveの特徴を知る必要がある】
  • HDFSメモリ
  • に依存する.
  • MapReduceに依存する処理データ
  • SQLのようなクエリー(ユーザプログラミングインターフェース)
  • を提供
  • バッチ処理方式大量データ処理
  • 自身はETLツール
  • を提供している.
    【Hiveアーキテクチャ】
    Driver(ドライバモジュール)-JVMプロセスは、クライアント要求を受信し、コンパイル、解釈、実行し、HiveQLをMapReduce Jobに翻訳してYarnに渡す
    Metastore(メタデータ):テーブルの名前、テーブルの列とパーティションとその属性、テーブルの属性(外部テーブルであるかどうかなど)、テーブルのデータが存在するディレクトリなどのテーブルの名前、テーブルの列とパーティションとその属性、テーブルの属性を含む(外部テーブル等かどうか)、テーブルのデータが存在するディレクトリ等.この部分の意味は、HDFSにおいてデータが関係型データベースのテーブル構造ではないことを知ることにある
  • コンパイラHive SQL変換オペレータ
  • オペレータは、Hiveの最小の処理部
  • である.
  • 各オペレータは、HDFSの1つの動作または1つのMapReduceジョブ
  • を表す.
    【二】Hive常用関数
    組み込み関数です.ここでは、一部の開発でよく使用される関数を列挙します.
    日付関数:
    【日付とタイムスタンプの変換】
    関数#カンスウ#
    説明
    from_unixtime(bigint unixtime[, string format])
    UNIXタイムスタンプ(1970-01-01 00:00:00:00 UTCから指定時間までの秒数)から現在のタイムゾーンのタイムフォーマットへの変換
    unix_timestamp()
    現在のタイムゾーンのUNIXタイムスタンプを取得
    unix_timestamp(string date)
    「yyyy-MM-dd HH:mm:ss」形式の日付をUNIXタイムスタンプに変換します.
    unix_timestamp(string date, string pattern)
    「yyyyyMMdd HH:mm:ss」形式の日付をUNIXタイムスタンプに変換します.
    select from_unixtime(1565452800,'yyyy-MM-dd')
    res: 2019-08-11
    
    select unix_timestamp()
    res: 1565506410
    
    select unix_timestamp('2019-08-11 00:00:00')
    res: 1565452800
    
    select unix_timestamp('20190811 11','yyyyMMdd HH')
    res: 1565492400
    

    【日付取得】
    関数#カンスウ#
    説明
    to_date(string timestamp)
    「戻る日付」セクション
    year(string date)
    年を返す
    month(string date)
    月に戻る
    day(string date)
    戻り日
    hour(string date)
    戻り時間
    minute(string date)
    戻る分
    second(string date)
    戻る秒
    select to_date('2019-08-11 10:03:01')
    res: 2019-08-11
    
    select year('2019-08-11 10:03:01')
    res: 2019
    
    select month('2019-08-11 10:03:01')
    res: 8
    
    ......
    

    【日付比較】
    関数#カンスウ#
    説明
    datediff(string enddate, string startdate)
    終了日から開始日を差し引いた日数を返します
    date_add(string startdate, int days)
    開始日startdateに戻ってdaysを追加した日付
    date_sub(string startdate, int days)
    開始日startdateを返してdaysを減らした後の日付を返します
    select datediff('2019-08-11','2016-12-02')
    res: 982
    
    select date_add('2019-08-08',10);
    res: 2019-08-18
    

    文字列関数
    関数#カンスウ#
    説明
    concat(string A, string B…)
    複数の文字列の接続
    concat_ws(string SEP, string A, string B…)
    複数の文字列をリンクし、文字列間を指定した区切りで区切ります.
    substr(string A, int start)
    テキスト文字列で指定した開始位置以降の文字.
    regexp_replace(string A, string B, string C)
    文字列AのB文字はC文字で置き換えられます
    regexp_extract(string subject, string pattern, int index)
    正規表現で指定した部分を下付きで返す
    parse_url(string urlString, string partToExtract [, string keyToExtract])
    URL指定の部分を返します.オプションには[HOST,PATH,QUERY,REF,PROTOCOL,FILE,AUTORITY,USERINFO]があります.
    get_json_object(string json_string, string path)
    split(string str, string pat)
    select concat('abc','iiii','ffff') 
    res: abciiiiffff
    
    select concat_ws('~~','iiii','ffff') 
    res: iiii~~ffff
    
    select substr('abcde',3) 
    res: cde
    
    select regexp_replace('test20190812', '19|08', '') 
    res: test2012
    
    select regexp_extract('test20190812', 'test(.*?)(0812)', 0), regexp_extract('test20190812', 'test(.*?)(0812)', 1), regexp_extract('test20190812', 'test(.*?)(0812)', 2)
    res: test20190812     2019    0812
    
    select parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'HOST') ,
    parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'QUERY') ,
    parse_url('https://mooc.study.163.com/smartSpec/detail/1001485004.htm?utm_source=test.com', 'PATH') 
    
    
    res: 
    "mooc.study.163.com"	
    "utm_source=test.com"	
    "/smartSpec/detail/1001485004.htm"	
    
    
    
    select get_json_object('{"store":{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],"bicycle":{"price":19.951,"color":"red1"}},"email":"amy@only_for_json_udf_test.net","owner":"amy1"}', '$.owner')
    res: amy1