ハイブSQL、パラメータ、カスタム関数

サンプルデータ:

1,小明1,lol-book-movie,beijing:shangxuetang-shanghai:pudong
2,小明2,lol-book-movie,beijing:shangxuetang-shanghai:pudong
3,小明3,lol-book-movie,beijing:shangxuetang-shanghai:pudong
4,小明4,lol-book-movie,beijing:shangxuetang-shanghai:pudong
5,小明5,lol-movie,beijing:shangxuetang-shanghai:pudong
6,小明6,lol-book-movie,beijing:shangxuetang-shanghai:pudong
7,小明7,lol-book,beijing:shangxuetang-shanghai:pudong
8,小明8,lol-book,beijing:shangxuetang-shanghai:pudong
9,小明9,lol-book-movie,beijing:shangxuetang-shanghai:pudong

テーブルのDDLの構文規則のハイブ完全な建設

create [temporary] [external] table [if not exists] [db_name.]table_name    -- (note: temporary available in hive 0.14.0 and later)
  [(col_name data_type [comment col_comment], ... [constraint_specification])]
  [comment table_comment]
  [partitioned by (col_name data_type [comment col_comment], ...)]
  [clustered by (col_name, col_name, ...) [sorted by (col_name [asc|desc], ...)] into num_buckets buckets]
  [skewed by (col_name, col_name, ...)                  -- (note: available in hive 0.10.0 and later)]
     on ((col_value, col_value, ...), (col_value, col_value, ...), ...)
     [stored as directories]
  [
   [row format row_format] 
   [stored as file_format]
     | stored by 'storage.handler.class.name' [with serdeproperties (...)]  -- (note: available in hive 0.6.0 and later)
  ]
  [location hdfs_path]
  [tblproperties (property_name=property_value, ...)]   -- (note: available in hive 0.6.0 and later)
  [as select_statement];   -- (note: available in hive 0.5.0 and later; not supported for external tables)

テーブルのハイブ建設(デフォルト内部テーブル)

-- 内部表
create table person(
id int,
name string,
likes array<string>,
address map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n';

-- 外部表
create table person(
id int,
name string,
likes array<string>,
address map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n'
location '/usr';

ビューテーブルが説明します

语法:| TABLE_NAME [書式設定の拡張]を記述する

describe formatted person;

内部および外部のテーブルテーブルとの間の差

ハイブ内部テーブルには、
       TABLE_NAME [いないが存在する場合]テーブルを作成
       、削除、テーブルのメタデータを、データが削除されます
ハイブ外部表を
       外部表を作成します。TABLE_NAMEの[未が存在する場合] LOCATIONのhdfs_pathの
       中に削除外部表の削除のみメタストアメタデータは削除されませんHDFSをテーブルデータ

テーブルを作成する方法の三種類

1、表table_name表ステートメントルーチンを作成します

2、テーブルを作成...選択として...(CTAS)スヌーズ

図3は、半自動モードのようなテーブルを作成します

住所:テーブル構築するための3つの方法https://blog.csdn.net/qq_26442553/article/details/85621767を

                  CTASは、音符にテーブルのポイントを構築しました:https://blog.csdn.net/qq_26442553/article/details/79593504

パーティションテーブルを意味:最適化クエリに。パーティションフィールドクエリを使用してみてください。パーティションフィールドを使用しない場合は、すべてのスキャンはなります。

静的パーティション

1、静的パーティション - テーブル操作

     内部テーブルは、対応するパーティションのメタデータとデータが削除されます。

-- 创建分区表
create table p_person (
id int,
name string,
likes array<string>,
address map<string,string>
) 
partitioned by (sex string,age int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n';

-- 添加分区:注意要讲所有的分区字段都写上
alter table p_person add partition (sex='man',age=20);

-- 删除分区:删除的时候只写需要删除的分区即可
alter table p_person drop partition (age=20);

2、ハイブクエリ構文テーブルのパーティション情報:

show partitions day_hour_table;

動的なパーティショニング

1、動的パーティションテーブルを作成します

-- 要开启支持动态分区参数设置
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nostrict;

-- 首先创建数据表
create table person(
id int ,
name string,
age int,
sex string,
likes array<string>,
address map<string,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n';

-- 然后创建结构分区表-分区表
create table psn_partitioned_dongtai(
id int ,
name string,
likes array<string>,
address map<string,string>
)
partitioned by (age int,sex string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
lines terminated by '\n';

-- 向数据表中加载数据
load data local inpath '/root/hivedata/psn1' into table person;
--向结构分区表中加载数据
from person
insert overwrite table psn_partitioned_dongtai partition(age,sex)
select id,name,likes,address,age,sex distribute by age,sex;

2、パラメータ

开启支持动态分区
set hive.exec.dynamic.partition=true;
默认:false
set hive.exec.dynamic.partition.mode=nostrict;
默认:strict(至少有一个分区列是静态分区)


set hive.exec.max.dynamic.partitions.pernode;
每一个执行mr节点上,允许创建的动态分区的最大数量(100)
set hive.exec.max.dynamic.partitions;
所有执行mr节点上,允许创建的所有动态分区的最大数量(1000)
set hive.exec.max.created.files;
所有的mr job允许创建的文件的最大数量(100000)

 

ポイントバレル

1記載のパーツのキット

      分割バレルは、ファイルの形で存在します。部品表のキットは、分割方法槽列は、異なる問題にモジュロハッシュ値、異なるデータ要素を取られ、バケット識別する各ファイル
      アプリケーションシナリオ:(サンプリング)サンプリングデータは、地図ジョイン

図2に示すように、サブバケットテーブルを作成します

-- 开启支持分桶
set hive.enforce.bucketing=true;
注意,设置该参数后,mr运行时,bucket个数与reduce task个数会保持一致
默认:false;设置为true之后,mr运行时会根据bucket的个数自动分配reduce task个数。(用户也可以通过mapred.reduce.tasks自己设置reduce任务个数,但分桶时不推荐使用)
注意:一次作业产生的桶(文件数量)和reduce task个数一致


-- 创建数据表
create table psn_fentong(
id int,
name string,
age int	
)
row format delimited 
fields terminated by ',';

-- 加载数据
load data local inpath '/root/hivedata/psn_fentong' into table psn_fentong;

-- 创建分通表
create table psn_fentong2(
id int,
name string,
age int
)
clustered by (age) into 4 buckets 
row format delimited fields terminated by ',';

-- 加载数据
insert into table psn_fentong2 select id ,name ,age from psn_fentong;

-- 数据抽样
select * from psn_fentong2 (bucket 2 out of 4 on age);

tablesample语法:
tablesample(bucket x out of y)
x:表示从哪个bucket开始抽取数据
y:必须为该表总bucket数的倍数或因子

例:
当表总bucket数为32时
TABLESAMPLE(BUCKET 3 OUT OF 8),抽取哪些数据?
共抽取2(32/16)个bucket的数据,抽取第2、第18(16+2)个bucket的数据

3、から挿入データをロードします

from psn21
insert overwrite table psn22 partition(age, sex)  
select id, name, age, sex, likes, address distribute by age, sex;

 

ハイブ側面図仮想テーブル

1、説明の役割

      用途:側面図のためにとUDTFの機能は、(爆発スプリット)を組み合わせて使用すること。

      まずUDTF 複数行に機能分割し、次にその結果を仮想テーブルの別名をサポートするために、複数のラインに結合されます。

      主に解決するために:選択使用UDTFをクエリ時に、クエリが一つだけ含めることができないUDTFを他の分野と同様に、複数含めることはできません、UDTFの問題を

図2に示すように、ケース

      、統計表は、どのように多くの都市をどのように多くの趣味がありますか

-- 查看表描述
describe formatted psn2;

select count(distinct(myCol1)), count(distinct(myCol2)) from psn2 
LATERAL VIEW explode(likes) myTable1 AS myCol1 
LATERAL VIEW explode(address) myTable2 AS myCol2, myCol3;

ハイブビュービュー

1.説明

      そして、リレーショナルデータベースは、通常のビューのように、ハイブは、ビューをサポートしています

      特長:

              これは、マテリアライズド・ビューをサポートしていません。

              唯一のクエリは、データ操作をロードしません

              ビューを作成し、単にメタデータを保持し、対応するサブクエリビュー場合クエリを実行

              ビューの定義に含ま場合ORDER BY / LIMITの文で、クエリビューにもORDER BY / LIMITのステートメントの操作、閲覧彼らは高い優先度を定義します

              ビューは、反復ビューをサポートしています

2、SQL

-- 语法
create view [if not exists] [db_name.]view_name 
  [(column_name [comment column_comment], ...) ]
  [comment view_comment]
  [tblproperties (property_name = property_value, ...)]
  as select ... ;

-- 创建视图
create view v_psn as select * from psn;

-- 查询视图
select colums from view;

-- 删除视图
drop view v_psn;

 

ハイブインデックス

1.目的:クエリと検索性能を最適化するために、

2、SQL

-- 创建索引
create index t1_index on table psn2(name) 
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' with deferred rebuild 
in table t1_index_table;
as:指定索引器;
in table:指定索引表,若不指定默认生成在default__psn2_t1_index__表中

-- 查询索引
show index on psn2;

-- 重建索引(建立索引之后必须重建索引才能生效)
alter index t1_index on psn2 rebuild;

-- 删除索引
删除索引是会连带删除维护该索引的索引表t1_index_table.
注意:删除索引不要手动删除索引表,这个索引表是系统维护的。如果需要删除索引,只删除相应的索引就可以了,其他的不用管
drop index t1_index on psn2;

ハイブスクリプトが実行されます

1、コマンドラインCLI:コンソールモード
        構文操作--hive
        - HDFS相互作用を持つ
            例:ハイブ> -ls DFS /;
        -システムの相互作用およびLinuxへ!始まり
            例えば:ハイブ> PWD!

2は、スクリプトが(実行されている実際の生産環境の最大で
        コンソールに出力されます結果「PSN2からSELECT *」--hive -e
        「psn2から選択* AAA --hive -eにAAAの出力を >」 クエリ結果ファイル
        --hive -S -e「psn2 SELECT * FROM > AAA -S」 ミュート出力、使用以下のように表さ
        ハイブファイル操作コマンド構文に書き込ま:--hive -fファイル(この方法を使い切った)注-fを使用すると、ファイルのファイルを呼び出す文はコマンドを実行するため
        -iファイル注--hive:ときハイブコンソールを終了していない後者の実装で-fを、しかしハイブコンソールに滞在します。さらにいくつかの文法よりもハイブ終了するには、コンソールの完了後に実行されている
        ハイブ内のファイルのLinuxシステムの内容を取得し、コンソールを実行するために--sourceをされて、ハイブ操作文に格納されたファイルは、
            ハイブ>ソース/ルート/ファイル
 3、 JDBC方法

       ハイブのサービスを開始するhiveserver2方法
 4、ウェブを

      GUIインタフェース(HWI、色合いなど、一般的に用いられる色相は、HWIがあまりにも辛いチキンを持っていません)

ご覧ください。

図1に示すように、テーブルの構成 

create table logdata (
    host string,
    identity string,
    t_user string,
    time string,
    request string,
    referer string,
    agent string)
  row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
  with serdeproperties (
    "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) \\[(.*)\\] \"(.*)\" (-|[0-9]*) (-|[0-9]*)"
  )
  stored as textfile;

  シリアライザデシリアライザ

  SerDe シリアライズとデシリアライズを行います。

  デカップリングの両方に保存して、実行エンジンとの間でデータの構築、。

  ハイブは、読み取りおよびコンテンツを記述し、行フォーマットはserdeで区切ら。

  serdeシリアライゼーションおよびデシリアライゼーション(ラインコンバータ)「org.apache.hadoop.hive.serde2.RegexSerDe」カノニカル変換、
        他の変換器を実装することができるされてもよいserdeカスタマイズそのインタフェース定義変換
    行SerDeフォーマット「org.apache.hadoop.hive.serde2.RegexSerDe」
    serdeproperties有する(
        「input.regex」=「は、各行の式の構文解析されています」
    )

 

データのロード

図1に示すように、負荷データモード

     データは任意のデータ変換することなく、テーブルにロードされたとき。ロード操作は、にデータをだけをコピーしているハイブテーブルに対応する位置。データがロードされたときに自動的にテーブルの下にディレクトリを作成します

-- 普通表加载数据
load data local inpath '/root/hivedata/person' into table person;

-- 分区表加载数据(静态分区)
load data local inpath '/root/hivedata/person' into table p_person partition (sex='man',age=10);

挿入モードから2、

      文法

from from_statement 
insert overwrite table tablename1 [partition (partcol1=val1, partcol2=val2 ...) [if not exists]] select_statement1 
[insert overwrite table tablename2 [partition ... [if not exists]] elect_statement2] 
[insert into table tablename2 [partition ...] select_statement2] ...;

     ケース

-- 静态分区表
from person 
insert overwrite table p_person partition (sex='woman', age=60) 
select id,name,likes,address;

 

カスタム機能

Hive  自定义函数
Hive的UDF开发只需要重构UDF类的evaluate函数即可。例:

package com.hrj.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
public class helloUDF extends UDF {
    public String evaluate(String str) {
        try {
            return "HelloWorld " + str;
        } catch (Exception e) {
            return null;
        }
    }
} 

Hive  自定义函数调用
将该java文件编译成helloudf.jar
hive> add jar helloudf.jar;
hive> create temporary function helloworld as 'com.hrj.hive.udf.helloUDF';
hive> select helloworld(t.col1) from t limit 10;
hive> drop temporary function helloworld;

注意 
1.helloworld为临时的函数,所以每次进入hive都需要add jar以及create temporary操作
2.UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF

 

ハイブのパラメータ

名前空間

読み取りと書き込みの権限

意味

hiveconf

読み書きできます

ハイブ-site.xmlの各構成変数間

例:ハイブ--hiveconf hive.cli.print.header =真

システム

読み書きできます

システム変数には、JVMの動作パラメータを

例:システム:user.name =ルート

ENV

リードオンリー

環境変数

例:ENV:JAVA_HOME

hivevar

読み書きできます

李:ハイブ-d ヴァル=キー

1によって$ {} 参照のために、前記システムENVの変数は、接頭辞で始まる必要があります

2、ハイブパラメータ設定モード

     (1) 設定ファイル変更$ HIVE_HOME} {/ confに/hive-site.xmlを

     (2)スタートハイブCLI 場合によって- hiveconf キー値= ようセット

                  例:ハイブ- hiveconf hive.cli.print.header =真

     (3)CLI その後、使用して設定されたコマンドを設定します

 

3、ハイブセットコマンド

      でハイブCLI コンソール可能に設定するハイブ継続的なパラメータクエリを、セット

      セットの設定:

                   セットhive.cli.print.header =はtrue。

      セットビュー:

                  セットhive.cli.print.header

      ハイブのパラメータ初期設定:

                 現在のユーザのホームディレクトリの下にHivercのファイル

                 以下のような:。〜/ Hiverc

                 ない場合は、直接ファイルを作成することができ、あなたはファイルに書かれたパラメータを設定する必要があり、ハイブ稼働して、それが設定ファイルの変更をロードします。

      ハイブ歴史運用コマンドセット:

                 〜/。hivehistory

公開された92元の記事 ウォンの賞賛3 ビュー5104

おすすめ

転載: blog.csdn.net/qq_22049773/article/details/103924087