4. HiveSQL-Datenmanipulation, Abfragesprache (DML, DQL)

1. Hive SQL-DML-Load lädt Daten

Funktion
Laden, Laden bezieht sich auf das Verschieben der Ansicht an die Position, die der Hive-Tabelle entspricht, und die Bewegung ist ein reiner Kopier- und Verschiebevorgang

Grammatik regeln

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)] [INPUTFORMAT 'inputformat' SERDE 'serde'] (3.0 or later)

Der Dateipfad der Syntaxregel
filepath gibt den zu verschiebenden Pfad an. Es kann auf eine Datei oder nur auf ein Verzeichnis verweisen (alle Dateien im Verzeichnis verschieben).
Der Dateipfad „filepath“ unterstützt relative Pfade, absolute Pfade und vollständige URIs mit Schema, die in Kombination mit dem Schlüsselwort LOCAL berücksichtigt werden sollten

LOKAL von Grammatikregeln

  • Geben Sie LOCAL an, der Dateipfad wird im lokalen Dateisystem gesucht
    • Wenn es auf einen relativen Pfad verweist, wird es relativ zum aktuellen Arbeitsverzeichnis des Benutzers interpretiert
    • Kann auch ein vollständiger URI sein – z. B.: file:///user/hive/project/data1
  • LOCAL nicht angegeben
    • Wenn der Dateipfad auf einen vollständigen URI verweist, wird dieser URI direkt verwendet
    • Wenn kein Schema angegeben ist, verwendet Hive den in der Hadoop-Konfigurationsdatei angegebenen Parameter fs.default.name (es überrascht nicht, dass es sich um HDFS handelt).

Das LOKALE Textdateisystem bezieht sich auf das lokale Linux-Dateisystem der Maschine, auf der sich der Hiveserver2-Dienst befindet, nicht auf das lokale Dateisystem, auf dem sich der Hive-Client befindet.

OVERWRITE von Grammatikregeln
Wenn das Schlüsselwort OVERWRITE verwendet wird, werden die vorhandenen Daten in der Zieltabelle (oder Partition) gelöscht und dann wird der Inhalt der Datei/des Verzeichnisses, auf das der Dateipfad verweist, der Tabelle/Partition hinzugefügt

1.1 Version: Daten vom lokalen FS oder HDFS laden

1. Üben Sie das Laden von Daten aus einem lokalen FS.
2. Üben Sie das Laden von Daten aus einem HDFS.
3. Verstehen Sie die chinesischen Schriftzeichen des Schlüsselworts „Local“.
4. Üben Sie das Laden von Daten in eine Partitionstabelle

-- step1:建表
-- 建表student_local 用于演示从本地加载数据
create table student_local(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ",";
-- 建表student_HDFS 用于演示从HDFS加载数据
create external table student_HDFS(num int,name string,sex string,age int,dept string) row format delimited fields terminated by ",";
-- 建表student_HDFS_p 用于演示从HDFS加载数据到分区表
create table student_HDFS_p(num int,name string,sex string,age int,dept string) partitioned by(country string) row format delimited fields terminated by ",";

-- 建议使用beeline客户端 可以显示出加载过程日志
-- step2:加载数据
-- 从本地加载数据 数据位于HS2(node1)本地文件系统 本质是hadoop fs -put上传操作
LOAD DATA LOCAL INPATH '/root/hivedata/students.txt' INTO TABLE student_local;

-- 从HDFS加载数据 数据位于HDFS文件系统根目录下 本质是hadoop fs -mv 移动操作
-- 先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS;

-- 从HDFS加载数据到分区表中并指定分区,数据位于HDFS文件系统根目录下
-- 先把数据上传到HDFS上 hadoop fs -put /root/hivedata/students.txt /
LOAD DATA INPATH '/students.txt' INTO TABLE student_HDFS_p partition(country="China");

1.2 Neue Funktionen von Hive3.0

  • Hive3.0+ wird beim Laden von Daten zusätzlich zum Verschieben und Kopieren in einigen Fällen als INSERT AS SELECT neu geschrieben
  • Hive3.0+ unterstützt auch die Verwendung von Eingabeformat und SerDe zur Angabe des Eingabeformats, z. B. Text, ORC usw.
    Wenn die Tabelle beispielsweise Partitionen hat und der Ladebefehl keine Partition angibt, wird die Last in diese konvertiert INSERT AS SELECT, und die letzte Spalte wird als Partitionsspalte angenommen. Wenn die Datei teuer und erwartet ist, wird ein Fehler ausgegeben

Zum Beispiel

CREATE TABLE IF NOT EXISTS tab1(col1 int, col2 int)
PARTITIONED BY (col3 int)
row format delimited fields terminated by ',';

-- 在hive3.0之后 新特性可以帮助我们把load改写为insert as select
LOAD DATA LOCAL INPATH '/root/hivedata/tab1.txt' INTO TABLE tab1;

--tab1.txt内容如下
11,22,1
33,44,2

2. Hive SQL-DML-Einfügung

2.1 Einfügen + Auswählen

Einfügen + Auswählen bedeutet: Fügen Sie das von der folgenden Abfrage zurückgegebene Ergebnis als Inhalt in die angegebene Tabelle ein und beachten Sie, dass OVERWRITE die vorhandenen Daten überschreibt.

  1. Stellen Sie sicher, dass die Anzahl der Abfrageergebnisspalten mit der Anzahl der Spalten übereinstimmt, die in die Datentabelle eingefügt werden müssen
  2. Wenn der abgefragte Datentyp nicht mit dem entsprechenden in die Tabelle eingefügten Spaltendatentyp übereinstimmt, wird er konvertiert. Es gibt jedoch keine Garantie dafür, dass die Konvertierung erfolgreich ist, und die Daten, bei denen die Konvertierung fehlschlägt, sind NULL.
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
-- step1:创建一张源表student
drop table if exists student;
create table student(num int,name string,sex string,age int,dept string)
row format delimited
fields terminated by ',';
-- 加载数据
load data local inpath '/root/hivedata/students.txt' into table student;

-- step2:创建一张目标表 只有两个字段
create table student_from_insert(sno int,sname string);
-- 使用insert+select插入数据到新表中
insert into table student_from_insert select num,name from student;

2.2 Mehrfacheinsätze Mehrfacheinsätze

  • Wenn man es in mehrere Wohltätigkeitsorganisationen und mehrere Einfügungen übersetzt, ist seine Kernfunktion: ein Scan, mehrere Einfügungen
  • Der Zweck der Syntax besteht darin, die Anzahl der Scans in einem Scan zu reduzieren. Führen Sie mehrere Einfügevorgänge durch
-- 当库里有一张表student
select * from student;
-- 创建两张新表
create table student_insert1(sno int);
create table student_insert2(sname string);
-- 多重插入
from student
insert overwrite table student_insert1
select num
insert overwrite table student_insert2
select name;

2.3 Dynamische Partition einfügen dynamische Partition einfügen

Überblick

  • Dynamisches Einfügen einer Partition bedeutet, dass der Wert der Partition dynamisch durch das Ergebnis der nachfolgenden SELECT-Abfrageanweisung bestimmt wird
  • Automatische Partitionierung basierend auf Abfrageergebnissen
-- 1.首先设置动态分区模式为非严格模式 默认已经开启了动态分区功能
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrit;

-- 2.当前库下有一张表student
select * from student;

-- 3.创建分区表 以sdept作为分区字段
create table student_partition(Sno int, Sname string, Sex string, Sage int) partitioned by(Sdept string);

-- 4.执行动态分区插入操作
insert into table student_partition partition(Sdept)
select num,name,sex,age,dept from student;
-- 其中,num,name,sex,age作为表的字段内容插入表中
-- dept作为分区字段值

2.4 Verzeichnisexportdaten einfügen

Das Syntaxformat
Hive unterstützt das Exportieren des Ergebnisses einer Auswahlabfrage in eine Datei und deren Speicherung im Dateisystem. Das Syntaxformat lautet wie folgt:
Hinweis: Der Exportvorgang ist ein OVERWRITE-Vorgang. Seien Sie vorsichtig

-- 标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
    [ROW FORMAT row_format] [STORED AS file_format]
SELECT ...FROM...

-- Hive extension(multiple inserts):
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]...

-- row_format
DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
  • Verzeichnisse können vollständige URIs sein. Wenn kein Schema angegeben ist, verwendet Hive die Hadoop-Konfigurationsvariable fs.default.name, um den Exportspeicherort zu bestimmen
  • Wenn das Schlüsselwort LOCAL verwendet wird, schreibt Hive die Daten in ein Verzeichnis im lokalen Dateisystem
  • In das Dateisystem geschriebene Daten werden als Text serialisiert, wobei die Spalten durch \001 und die Zeilen durch Zeilenumbrüche getrennt sind. Wenn keine der Spalten primitive Datentypen ist, werden diese Spalten in das JSON-Format serialisiert. Sie können beim Importieren auch das Trennzeichen für neue Zeilen und das Dateiformat angeben
-- 导出操作演示
-- 当前库下已有一张表student
select * from student;

-- 1.导出查询结果到HDFS指定目录下
insert overwrite directory '/tmp/hive_export/e1' select * from student;

-- 2.导出时指定分隔符和文件存储格式
insert overwrite directory '/tmp/hive_export/e2' row format delimited fields terminated by ','
stored as orc
select * from student;

-- 3.导出数据到本地文件系统指定目录下
insert overwrite local directory '/root/hive_export/e1' select * from student;

3. Hive-Transaktionstransaktionstabelle

3.1 Umsetzungsprinzip

Realisierungsprinzip
Hive-Dateien werden auf HDFS gespeichert, und HDFS unterstützt keine willkürliche Änderung von Dateien, sodass dies nur auf andere Weise erfolgen kann.

  1. Verwenden Sie HDFS-Dateien als Originaldaten und verwenden Sie Delta, um die inkrementellen Datensatzdaten von Transaktionsvorgängen zu speichern
  2. Die ausgeführte Transaktion wird vom Ordner verwaltet, der mit dem Staging beginnt, und der Delta-Ordner ist das Ende der Ausführung. Jedes Mal, wenn eine Transaktionsoperation ausgeführt wird, gibt es einen solchen Delta-Inkrementalordner
  3. Führen Sie beim Zugriff auf Hive-Daten HDFS-Originaldateien und inkrementelle Deltadateien zusammen, um die neuesten Daten abzufragen
  • Die INSERT-Anweisung erstellt direkt das Delta-Verzeichnis
  • DELETE Verzeichnispräfix löschen - Delta
  • Die UPDATE-Anweisung implementiert die Split-Update-Funktion, d. h. zuerst löschen und dann einfügen

Delta-Ordnerbenennungsformat

  • delta_minWID_maxWID_stmtID, dh das Delta-Präfix, die ID-Position der Schreibtransaktion und die Anweisungs-ID; das zu löschende Präfix ist delete_delta, das die zu löschende Datei enthält
  • Hive erstellt für Schreibtransaktionen (INSERT, DELETE usw.) eine Schreibtransaktions-ID (Write ID), die innerhalb des Tabellenbereichs eindeutig ist
  • Die Anweisungs-ID (Anweisungs-ID) wird verwendet, wenn in einer Transaktion mehrere Schreibanweisungen vorhanden sind, und dient als eindeutige Kennung

Im Delta-Ordner jeder Transaktion befinden sich zwei Dateien:

  1. Der Inhalt von _orc_acid_version ist 2, dh die aktuelle ACID-Versionsnummer ist 2. Der Hauptunterschied zu Version 1 besteht darin, dass die UPDATE-Anweisung die Split-Update-Funktion übernimmt, dh zuerst löschen und dann einfügen. Bei dieser Datei handelt es sich nicht um eine ORC-Datei. Sie können sie herunterladen und direkt anzeigen
  2. Die Datei „bucket_00000“ ist der geschriebene Dateninhalt. Wenn die Transaktionstabelle keine Partitionen und Buckets hat, gibt es nur eine solche Datei. Dateien werden im ORC-Format, der zugrunde liegenden Binärdatei, gespeichert. Verwenden Sie ORC TOOLS, um
    den Vorgang anzuzeigen: 0 bedeutet Einfügen, 1 bedeutet Aktualisieren, 2 bedeutet Löschen. Da Split-Update verwendet wird, wird UPDATE nicht angezeigt, sodass die Operation in der Delta-Datei 0 und die Operation in der Datei delete_delta 2 ist
    originalTransaction, currentTransaction: die ursprüngliche Schreibtransaktions-ID dieses Datensatzes, die aktuelle Schreibtransaktions-ID
    rowId : Eine automatisch inkrementierte eindeutige ID, eindeutige Zeile in der Kombination aus Schreibtransaktion und Bucketing
    : spezifische Daten. Für die DELETE-Anweisung ist es null, für INSERT sind es die eingefügten Daten, für UPDATE sind es die aktualisierten Daten

Combiner (Verdichter)

  • Wenn die Tabelle geändert wird, werden immer mehr Delta-Inkrementaldateien erstellt, die zusammengeführt werden müssen, um eine ausreichende Leistung aufrechtzuerhalten
  • Heweapon Compactor ist ein Hintergrundprozess, der im Hive Metastore läuft und das ACID-System unterstützt. Die gesamte Zusammenführung erfolgt im Hintergrund und verhindert nicht das gleichzeitige Lesen und Schreiben von Daten. Nach dem Zusammenführen wartet das System, bis die Lesevorgänge aller alten Dateien abgeschlossen sind, bevor es die alten Dateien löscht.
  • Es gibt zwei Arten von Zusammenführungsvorgängen: geringfügige Verdichtung (kleine Zusammenführung) und große Verdichtung (große Zusammenführung).
    • Durch die kleine Zusammenführung wird eine Gruppe von Delta-Inkrementaldateien in eine einzelne Inkrementaldatei umgeschrieben. Die Standardauslösebedingung ist 10 Delta-Dateien
    • Bei der großen Zusammenführung werden eine oder mehrere inkrementelle Dateien und Basisdateien in eine neue Basisdatei umgeschrieben. Die Standardauslösebedingung ist, dass die Deltadatei 10 % der Basisdatei entspricht

3.2 Einstellungen und Einschränkungen für die Verwendung von Transaktionstabellen

Einschränkungen
Obwohl Hive Transaktionen mit ACID-Semantik unterstützt, ist die Verwendung nicht so bequem wie in MySQL und es gibt viele Einschränkungen

  1. BEGIN, COMMIT und ROLLBACK werden noch nicht unterstützt, alle Sprachoperationen werden automatisch festgeschrieben
  2. Das Tabellendateispeicherformat unterstützt nur ORC
  3. Zur Aktivierung der Transaktionsnutzung sind Konfigurationsparameter erforderlich
  4. Externe Tabellen können nicht als Transaktionen erstellt werden, da Hive nur Metadaten steuern und keine Daten verwalten kann
  5. Der Tabellenattributparameter transaktional muss auf true gesetzt sein
  6. Der Hive-Transaktionsmanager muss auf org.apache.hadoop.hive.ql.lockmgr.DbTxnManager eingestellt sein, um ACID-Tabellen zu verwenden
  7. Die Transaktion unterstützt die LOAD DATA...-Anweisung nicht

Legen Sie die Parameter
clientseitig fest

set hive.support.concurrency = true; -- Hive是否支持并发
set hive.enforce.bucketing = true; -- 从Hive2.0开始就不再需要 是否开启分桶功能
set hive.exec.dynamic.partition.mode = nonstrict; -- 动态分区模式 非严格
set hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; 

Server:

set hive.compactor.initiator.on = true; -- 是否在Metastore实例上运行启动线程和清理线程
set hive.compactor.worker.threads = 1; -- 在此metastore实例上运行多个压缩程序工作线程

4.Hive SQL-DML-Update、Delete

Überblick

  • Hive ist ein Hadoop-basiertes Data Warehouse und ein analyseorientiertes Support-Analysetool. Ordnen Sie die vorhandenen Struktur- und Datendateien in Tabellen zu und stellen Sie dann die Fähigkeit von SQL zur Verfügung, Daten zu analysieren
  • Daher besteht die übliche Operation in Hive darin, die Abfrageauswahloperation zu analysieren
  • Hive unterstützte in der Anfangszeit keine Aktualisierungs- und Löschsyntax, da es sich bei den von Hive verarbeiteten Daten ausschließlich um vorhandene Daten und historische Daten handelt
  • Nachfolgender Hive unterstützt verwandte Aktualisierungs- und Löschvorgänge, es gibt jedoch viele Einschränkungen
-- 创建Hive事务表
create table trans_student(
    id int,
    name string,
    age int
) stored as orc TBLPROPERTIES('transactional'='true');

-- 针对事务表进行insert update delete操作
insert into trans_student(id, name, age)
values(1,"Allen",18);

update trans_student
set age = 20
where id = 1;

delete from trans_student where id = 1;

5. Hive SQL-DQL-Select-Abfragedaten

Syntaxbaum

  • Wo abgefragt werden soll, hängt von der Tabellenreferenz ab, die dem Schlüsselwort FROM folgt. Kann eine gewöhnliche physische Tabelle, Ansicht, ein Join-Ergebnis oder ein Unterabfrageergebnis sein
  • Bei Tabellen- und Spaltennamen wird die Groß-/Kleinschreibung nicht beachtet
[WITH CommonTableExpression (, CommonTableExpression) *]
SELECT [ALL|DISTINCT] select_expr,select_expr,...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
]
[LIMIT [offset,] row];

5.1 Fall: Auswahlabfrage der US-amerikanischen Covid-19-Neukronendaten

Bereiten Sie die ausgewählte Grammatiktestumgebung vor, die Datendatei „us_covid19-counties.dat“, die die kumulative Anzahl bestätigter Fälle und die kumulative Anzahl von Todesfällen in jedem Landkreis in den Vereinigten Staaten am 28.01.2021 aufzeichnet

数据示例:
2021-01-28,Coffee,Alabama,01031,4795,72

Vorbereitung der Datenumgebung

-- step1:创建普通表t_usa_covid19
drop table if exists t_usa_covid19;
create table t_usa_covid19(
    count_date string,
    county string,
    state string,
    fips int,
    cases int,
    deaths int
) row format delimited fields terminated by ',';
-- 将源数据load加载到t_usa_covid19表对应的路径下
load data local inpath '/root/hivedata/us-covid19-counties.dat' into table t_usa_covid19;

-- step2:创建一张分区表 基于count_date日期,state州进行分区
create table if not exists t_usa_covid19_p(
    county string,
    fips int,
    deaths int
)partitioned by(count_date string,state string)
row format delimited fields terminated by ',';

-- step3:使用动态分区插入将数据导入t_usa_covid19_p中
set hive.exec.dynamic.partition.mode = nonstrict;

insert into table t_usa_covid19_p partion(count_date,state)
select county,fips,cases,deaths,count_date,state from t_usa_covid19;

Grundlegende Grammatikübungen
select_expr
select_expr gibt die von der Abrufabfrage zurückgegebene Spalte an. Es muss mindestens ein select_expr vorhanden sein

-- 1.select_expr
-- 查询所有字段或者指定字段
select * from t_usa_covid19_p;
select county, cases, deaths from t_usa_covid19_p;

-- 查询匹配正则表达式的所有字段
SET hive.support.quoted.identifiers =none;
select `^c.*` from t_usa_covid19_p; --反引号不在解释为其他含义,被解释为正则表达式
-- 查询当前数据库
select current_database(); -- 省去from关键字
-- 查询使用函数
select count(county) from t_usa_covid19_p;

ALL und DISTINCT
werden verwendet, um anzugeben, wie mit doppelten Zeilen in den Abfrageergebnissen
1 umgegangen werden soll. Wenn diese Optionen nicht angegeben sind, ist der Standardwert ALL
DISTINCT, um anzugeben, dass doppelte Zeilen aus der Ergebnismenge gelöscht werden sollen

-- 2.ALL、DISTINCT
-- 返回所有匹配的行
select state from t_usa_covid19_p;
-- 相当于
select all state from t_usa_covid19_p;
-- 返回所有匹配的行 去除重复结果
select distinct state from t_usa_covid19_p;
-- 多个字段distinct 整体去重
select county,state from t_usa_covid19_p;
select distinct county,state from t_usa_covid19_p;
select distinct sex from student;

WO

  • Auf „Where“ folgt ein boolescher Ausdruck für die Abfragefilterung
  • Im Where-Ausdruck können alle von Hive unterstützten Funktionen und Operatoren verwendet werden, mit Ausnahme der Aggregationsfunktion (da die Aggregationsfunktion sie unter der Voraussetzung verwendet, dass die Ergebnismenge bestimmt wurde. Die Where-Klausel befindet sich noch im Prozess der „Bestimmung“. „die Ergebnismenge, sodass Aggregatfunktionen nicht verwendet werden können)
  • Ab Hive0.13 unterstützt die where-Klausel bestimmte Arten von Unterabfragen
-- 3.WHERE CAUSE
select * from t_usa_covid19_p where 1 > 2;
select * from t_usa_covid19_p where 1 = 1;
-- where 条件中使用函数 找出州名字字母长度超过10位的有哪些
select * from t_usa_covid19_p where length(state) > 10;
-- where 子句支持子查询
select *
from A
where A.a in (select foo from B);

Partitionsabfrage, Partitionsbereinigung

  • Für Hive-partitionierte Tabellen können bei der Abfrage Partitionsabfragen angegeben werden, um vollständige Tabellenscans zu reduzieren, was auch als Partitionsbereinigung bezeichnet wird
  • Die sogenannte Partitionsbereinigung: Beim Abfragen einer partitionierten Tabelle wird geprüft, ob in der Where-Klausel oder der On-Klausel im Join ein Filter für das Partitionsfeld vorhanden ist. Wenn vorhanden, werden nur die Partitionen berücksichtigt, die die Bedingungen erfüllen Auf die Abfrage wird zugegriffen, d. h. es werden keine Zugriffsbedingungen gekürzt. Partition
-- 4.分区查询、分区裁剪
-- 找出来自加州,累计死亡人数大于1000的县 state字段就是分区字段 进行分区裁剪 避免全表扫描
select * from t_usa_covid19_p where state = "California" and deaths > 1000;
-- 多分区裁剪
select * from t_usa_covid19_p where count_date = "2021-01-28" and state = "California" and deaths > 1000;

GRUPPIERE NACH

  • Die „group by“-Anweisung wird verwendet, um die Aggregatfunktion zu kombinieren, um die Ergebnisse nach einer oder mehreren Spalten zu gruppieren.
    Hinweis: Das Feld von „select_expr“ in der „group by“-Anweisung erscheint: entweder das nach „group by“ gruppierte Feld oder das von der Aggregatfunktion angewendete Feld ( Vermeiden Sie eine Feldmehrdeutigkeit mehrerer Werte.)
-- 5.GROUP BY
-- 根据state州进行分组
-- 被聚合函数应用
select state,count(deaths)
from t_usa_covid19_p where count_date = "2021-01-28" group by state;

HABEN

  • Der Grund für das Hinzufügen der HAVING-Klausel in SQL besteht darin, dass das Schlüsselwort WHERE nicht mit Aggregatfunktionen verwendet werden kann
  • Die HAVING-Klausel ermöglicht es uns, die Datengruppen nach der Gruppierung zu filtern, und wir können Aggregatfunktionen in Have verwenden, da zu diesem Zeitpunkt „where“ und „group by“ ausgeführt wurden und die Ergebnismenge bestimmt wurde
-- 6.HAVING
-- 统计死亡病例数大于10000的州
-- 先where分组过滤(此处是分组裁剪),在进行group by分组,分组后每个结果集确定在使用having过滤
select state,sum(deaths)
from t_usa_covid19_p
where count_date = "2021-01-28"
group by state
hvaing sum(deaths) > 10000;

-- 在group by 的时候组合函数已经作用得到结果 having直接引用结果过滤 不需要再单独计算一次了
select state,sum(deaths) as cnts
from t_usa_covid19_p
where count_date = "2021-01-28"
group by state
hvaing cnts > 10000;

Der Unterschied zwischen HABEN und WO

  • Es besteht darin, die Daten nach der Gruppierung zu filtern
  • Wo tatsächlich die Daten vor der Gruppierung gefiltert werden,
  • Aggregationsfunktionen können nach have verwendet werden
  • Aggregatfunktionen können nach where nicht verwendet werden

GRENZE

  • limit wird verwendet, um die Anzahl der von der SELECT-Anweisung zurückgegebenen Zeilen zu begrenzen
  • limit akzeptiert ein oder zwei numerische Argumente, die beide negative Ganzzahlkonstanten sein müssen
  • Der erste Parameter gibt den Offset der ersten zurückzugebenden Zeile an (ab Hive 2.0.0), und der zweite Parameter gibt die maximale Anzahl der zurückzugebenden Zeilen an. Wenn ein einzelnes Argument angegeben wird, stellt es die maximale Anzahl von Zeilen dar und der Offset ist standardmäßig 0.
-- 7.limit
-- 返回2021-1-28加州的前5条数据
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
limit 5;

-- 返回结果从第行3开始,共3行
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
limit 2,3; -- 注意:第一个参数偏移量是从0开始的

Reihenfolge der Ausführung

  • Ausführungsreihenfolge während der Abfrage: von > wo > Gruppe (einschließlich Aggregation) > mit > Reihenfolge > auswählen
    • Aggregierte Anweisungen (Summe, Min, Max, Durchschnitt, Anzahl) werden vorrangig vor Klauseln ausgeführt
    • Die Where-Klausel wird vor der Aggregationsanweisung (Summe, Min, Max, Durchschnitt, Anzahl) im Abfrageprozess ausgeführt

5.2 High-Level-Syntax abfragen

SORTIEREN NACH

  • Die ORDER BY-Syntax in Hive SQL ähnelt der ORDER BY-Syntax in der Standard-SQL-Sprache und sortiert die Ausgabeergebnisse global
  • Die Standardsortierung ist aufsteigend (ASC), sie kann aber auch als DESC absteigend angegeben werden
  • In Hive 2.1.0 und späteren Versionen wird es unterstützt, die Sortierreihenfolge der Nulltyp-Ergebnisse für jede Spalte in der ORDER BY-Klausel anzugeben (ASC ist standardmäßig zuerst null und DESC danach standardmäßig null).
-- 1.order by
-- 根据字段进行排序
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths;

select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths desc;

-- 强烈建议将LIMIT与ORDER BY一起使用,避免数据集行数过大
-- 当hive.mapred.mode设置为严格模式时,使用不带LIMIT的ORDER BY会引发异常
select * from t_usa_covid19_p
where count_date = "2021-01-28"
and state = "California"
order by deaths desc
limit 3;

CLUSTER VON

  • Gruppieren Sie die Daten nach dem angegebenen Feld und sortieren Sie die Daten dann in positiver Reihenfolge nach dem Feld (nur positive Reihenfolge).
    • Gruppierungsregel-Hash-Hash
    • Je nach Anzahl der Reduzierungsaufgaben in mehrere Gruppen unterteilt
-- 2.cluster by
select * from student;
-- 不指定reducetask个数(自动设置为1)
select * from student cluster by num;

-- 手动设置reducetask个数
set mapreduce.job.reduces=2;
select * from student cluster by num;

Einschränkungen der CLUSTER BY-
Anforderungen: Teilen Sie sich nach Geschlecht und Geschlecht in zwei Teile auf und sortieren Sie in jeder Gruppe in umgekehrter Reihenfolge des Alters

  • Cluster by kann nicht alleine durchgeführt werden, daher kann das Feld zum Gruppieren und Sortieren nur dasselbe sein
  • order by kann hier nicht mehr verwendet werden, da es sich um eine globale Sortierung handelt und es nur eine Ausgabe gibt, die den Bedarf nicht decken kann

DISTRIBUTE BY + SORT BY
DISTRIBUTE BY + SORT BY entspricht der Aufteilung der Funktion von CLUSTER BY in zwei Teile:
Wenn die Felder von DISTRIBUTE BY + SORT BY gleich sind, gilt: CLUSTER BY = DISTRIBUTE BY + SORT BY
1. DISTRIBUTE BY ist Verantwortlich für die Angabe der Feldgruppierung.
2. SORT BY ist für die Sortierregeln innerhalb der Gruppe verantwortlich.
Gruppierungs- und Sortierfelder können unterschiedlich sein

-- 案例:把学生表数据根据性别分为两个部分,每个分组内根据年龄的倒序排序
select * from student distribute by sex sort by age desc;

Union-Joint-Abfrage
UNION wird verwendet, um die Ergebnisse mehrerer SELECT-Anweisungen in einem Ergebnissatz
1 zu kombinieren. Die Verwendung des DISTINCT-Schlüsselworts hat die gleiche Standardwirkung wie die reine Verwendung von UNION, und doppelte Zeilen werden gelöscht. Hive-Versionen vor 1.2.0 unterstützen nur UNION ALL, und in diesem Fall werden doppelte Zeilen nicht entfernt.
2. Bei Verwendung des Schlüsselworts ALL werden doppelte Zeilen nicht gelöscht und die Ergebnismenge enthält alle übereinstimmenden Zeilen von Select-Anweisungen (einschließlich doppelte Zeilen)
3. Die Anzahl und Namen der von jeder select_statement zurückgegebenen Spalten müssen gleich sein

select_statement
    UNION [ALL|DISTINCT]
select_statement
    UNION [ALL|DISTINCT]
select_statement...;
select num,name from student_local
union ALL
select num,name from student_hdfs;

select num,name from student_local
union DISTINCT
select num,name from student_hdfs;

-- 如果要将ORDER BY,SORT BY,CLUSTER BY,DISTRIBUTE BY或LIMIT应用于单个SELECT
-- 请将子句放在括住select的括号内
select num,name from (select num,name from student_local limit 2) subq1
union
select num,name from (select num.name from student_hdfs limit 3) subq2;
-- 如果放在最后,则是对联合后的表操作

Unterabfragen in der from-Klausel (Unterabfragen)

  • In Version 0.12 von Hive werden Unterabfragen nur in der FROM-Klausel unterstützt. Der Unterabfrage muss ein Name gegeben werden, da jede Tabelle in der from-Klausel einen Namen haben muss. Spalten in den von einer Unterabfrage zurückgegebenen Ergebnissen müssen eindeutige Namen haben. Die von der Unterabfrage zurückgegebenen Spalten stehen in der äußeren Abfrage genauso zur Verfügung wie die Spalten der echten Tabelle. Eine Unterabfrage kann auch ein Abfrageausdruck mit UNION sein
  • Hive unterstützt jede Ebene von Unterabfragen, auch verschachtelte Unterabfragen genannt
  • Unterabfragenamen in Hive 0.13.0 und höher kann das optionale Schlüsselwort AS vorangestellt werden
  • Ab Hiv0.13 unterstützt die where-Klausel die folgenden Arten von Unterabfragen
    • Nicht korrelierte Unterabfrage: Diese Unterabfrage bezieht sich nicht auf die Spalten in der übergeordneten Abfrage und die Abfrageergebnisse können Konstanten von IN- und NOT IN-Anweisungen sein
    • Korrelierte Unterabfragen: Unterabfragen beziehen sich auf Spalten in der übergeordneten Abfrage
-- from子句中子查询
-- 子查询
select num
from(
    select num,name from student_local
) tmp;

-- 包含UNION ALL的子查询示例
select t3.name
from(
    select num,name from student_local
    union all
    select num,name from student_hdfs
) t3;

-- where 子句中子查询
-- 不相关子查询,相当于IN、NOT IN子查询中鞥选择一个列
-- (1)执行子查询,其结果不被显示,而是传递给外部查询,作为外部查询的条件使用
-- (2)执行外部查询,并显示整个结果
select *
from student_hdfs
where student_hdfs.num IN (select num from student_local limit 2);

-- 相关子查询,指EXISTS 和 NOT EXISTS子查询
select A
from T1
where exists (select B from T2 where T1.X = T2.Y);

5.3.Gemeinsame Tabellenausdrücke (CTE)

Einführung in CTEs

  • Ein allgemeiner Ausdruck (CTE) ist ein temporärer Ergebnissatz: der Ergebnissatz, der aus der einfachen Abfrage abgeleitet wird, die in der WITH-Klausel unmittelbar vor dem Schlüsselwort select oder insert angegeben wird
  • CTEs werden nur innerhalb des Ausführungsbereichs einer einzelnen Anweisung definiert
  • CTE kann in den Anweisungen „select“, „insert“, „create table as select“ oder „create view as select“ verwendet werden
[WITH CommentTableExpression (, CommentTableExpression)*]
SELECT ...;
-- select语句中的CTE
with q1 as (select num,name,age from student where num = 95002)
select *
from q1;

-- from风格
with q1 as (select num,name,age from student where num = 95002)
from q1
select *;

-- chaining CTEs链式
with q1 as (select num,name,age from student where num = 95002)
     q2 as (select num,name,age from q1)
select * from (select num from q2) a;

-- union
with q1 as (select * from student where num = 95002),
     q2 as (select * from student where num = 95004)
select * from q1 union all select * from q2;

-- 视图,CTAS和插入语句中的CTE
-- insert
create table s1 like student;

with q1 as (select * from where num=95002)
from q1
insert overwrite table s1
select *;

select * from s1;

-- ctas
create table s2 as
with q1 as (select * from student where num = 95002)
select * from q1;

-- view
create view v1 as
with q1 as (select * from student where num = 95002)
select * from q1;

select * from v1;

6. Hive SQL Join-Vorgang

Die Join-Syntax wird verwendet, um Abfragedaten aus diesen Tabellen entsprechend der Beziehung zwischen den Spalten in zwei oder mehr Tabellen zu kombinieren. In
Hive 3.1.2 werden insgesamt 6 Join-Syntaxen unterstützt: Inner Join (Inner Join), Left Join ( Linker Join (linke Verbindung), rechter Join (rechte Verbindung), vollständiger äußerer Join (vollständige äußere Verbindung), linker Semi-Join (halboffene Verbindung herstellen), Cross-Join (Kreuzverbindung, auch kartesisches Produkt genannt)

6.1 Join-Syntaxregeln

Join-Syntaxregeln

  • Tabellenreferenz: Dies ist der Name der Tabelle, die in der Join-Abfrage verwendet wird, und es kann auch ein Unterabfrage-Alias ​​sein (das Abfrageergebnis wird als Tabelle für die Teilnahme am Join verwendet).
  • table_factor: Wie table_reference ist es der Tabellenname, der in der Verbindungsabfrage verwendet wird, oder es kann ein Unterabfragealias sein
  • join_condition: Mit der Join-Abfrage verknüpfte Bedingungen. Wenn Sie mehr als zwei Tabellen verknüpfen müssen, verwenden Sie das Schlüsselwort AND
join_table:
  table_reference [INNER] JOIN table_factor [join_condition]
| table_reference {
   
   LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table _reference [join_condition] (as of Hive1.0)

join_condition:
  ON expression

Join-Syntaxanreicherung

  • Die Join-Syntax von Hive war seit seiner Veröffentlichung nicht umfangreich
  • Ab Hive 0.13.0 wird die implizite Join-Notation unterstützt. Erlauben Sie der FROM-Klausel, eine durch Kommas getrennte Liste von Tabellen zu verknüpfen, und lassen Sie dabei das Schlüsselwort JOIN weg
  • Ab Hive 2.2.0 werden komplexe Ausdrücke in ON-Klauseln und ungleiche Verknüpfungen unterstützt.

6.2 Detaillierte Erläuterung der Join-Methode in 6

Vorbereitung der Join-Abfrageumgebung
Bereiten Sie drei Tabellen vor und laden Sie Daten in die Tabelle

-- table1:员工表
create table employee(
    id int,
    name string,
    deg string,
    salary int,
    dept string
) row format delimited
fields terminated by ',';

-- table2:员工家庭住址信息表
create table employee_address(
    id int,
    hno string,
    street string,
    city string
) row format delimited
fields terminated by ',';

-- table3:员工联系方式信息表
create table employee_connection(
    id int,
    phno string,
    email string
) row format delimited
fields terminated by ',';

innerer Join

  • Inner Join ist die häufigste Art von Join. Er wird auch als normaler Join bezeichnet, wobei Inner weggelassen werden kann: Inner Join == Join
  • Es bleiben nur Daten übrig, die der Join-Bedingung entsprechen und in beiden zu verbindenden Tabellen vorhanden sind
-- 1.inner join
select e.id,e.name,e_a.city,e_a.street
from employee e inner join employee_address e_a
on e.id = e_a.id;

-- 等价于inner join = join
select e.id,e.name,e_a.city,e_a.street
from employee e join employee_address e_a
on e.id = e_a.id;

-- 等价于 隐式连接表达法
-- 等价于inner join = join
select e.id,e.name,e_a.city,e_a.street
from employee e ,employee_address e_a
on e.id = e_a.id;

links beitreten

  • Left Join Chinesischer Name linke äußere Verbindung oder linke Verbindung
  • Der linke Join basiert auf allen Daten in der linken Tabelle und ist damit verknüpft. Alle Daten in der linken Tabelle werden zurückgegeben, und die Anzeige in der rechten Tabelle wird zurückgegeben, und die Anzeige, die nicht verbunden ist, wird zurückgegeben als null zurückgegeben
-- 2.left join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left join employee_connection e_conn
on e.id = e_conn.id;

-- 等价于left outer join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e left outer join employee_connection e_conn
on e.id = e_conn.id;

rechts beitreten

  • Die rechte Verbindung wird auf Chinesisch rechte äußere Verbindung oder rechte Verbindung genannt
  • Der rechte Join basiert beim Herstellen einer Verbindung auf allen Daten in der rechten Tabelle, und der linke verknüpft ihn. Alle Daten in der rechten Tabelle werden zurückgegeben, und die Anzeige in der linken Tabelle wird zurückgegeben, die Anzeige jedoch nicht zugeordnet wird als null zurückgegeben
-- 2.right join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e right join employee_connection e_conn
on e.id = e_conn.id;

-- 等价于left outer join
select e.id,e.name,e_conn.phno,e_conn.email
from employee e right outer join employee_connection e_conn
on e.id = e_conn.id;

vollständiger äußerer Join

  • Die vollständige äußere Verknüpfung entspricht der vollständigen Verknüpfung, die auf Chinesisch als vollständige äußere Verknüpfung oder äußere Verknüpfung bezeichnet wird
  • Enthält alle Zeilen der linken und rechten Tabelle, unabhängig davon, ob in der anderen Tabelle übereinstimmende Zeilen vorhanden sind
-- 4.full outer join
select e.id,e.name,e_a.city,e_a.street
from employee e full outer join employee_address e_a
on e.id = e_a.id;

-- 等价于
select e.id,e.name,e_a.city,e_a.street
from employee e full join employee_address e_a
on e.id = e_a.id;

Linke Halbverbindung, linke Halbverbindung, offene Verbindung

  • Die linke halboffene Verbindung gibt die Datensätze der linken Tabelle zurück, vorausgesetzt, dass die Datensätze die Beurteilungsbedingungen in der on-Anweisung für die rechte Tabelle erfüllen
  • Unter dem Gesichtspunkt der Wirkung ähnelt es ein wenig einer inneren Verknüpfung und gibt nur das Ergebnis der linken Tabelle zurück
-- 5.left semi join
select *
from employee e left semi join employee_address e_addr
on e.id = e.addr;

-- 相当于inner join,但是只返回左表全部数据,只不过效率高一些
select *
from employee e inner join employee_address e_addr
on e.id = e.addr;

Kreuzverbindung

  • Ein Cross-Join gibt das kartesische Produkt der beiden zu verbindenden Tabellen zurück, und die Anzahl der zurückgegebenen Zeilen ist gleich dem Produkt der Anzahl der Zeilen in den beiden Tabellen. Verwenden Sie bei großen Tabellen Cross-Join mit Vorsicht
  • Der im SQL-Standard definierte Cross-Join ist ein bedingungsloser Inner-Join. Gibt das kartesische Produkt zweier Tabellen zurück, ohne einen assoziativen Schlüssel anzugeben.
  • In der HiveSQL-Syntax kann auf den Cross-Join eine WHERE-Klausel zum Filtern oder zum Bedingungsfiltern folgen
-- 6.cross join
-- 下列A、B、C执行结果相同,但是效率不一样
-- A:
select a.*,b.* from employee a.employee_addtess b where a.id=b.id;
-- B:
select * from employee a cross join employee_address b on a.id=b.id;
select * from employee a cross join employee_address b where a.id=b.id;
-- C:
select * from employee a inner join employee_address b on a.id=b.id;
-- 一般不建议使用方法A和B,因为如果有WHERE子句的话,往往会先生成两个表行数乘积的行的数据表然后根据where条件从中选择
-- 因此,如果两个需要求交集的表太大,将会非常非常慢,不建议使用

6.3 Vorsichtsmaßnahmen für die Verwendung von Join

  1. Ermöglicht die Verwendung komplexer Join-Ausdrücke und unterstützt nicht äquivalente Joins
select a.* from a join b on (a.id = b.id);
select a.* from a join b on (a.id = b.id and a.department = b.department);
select a.* from a left outer join b on (a.id <> b.id);
  1. In derselben Abfrage können mehr als zwei Tabellen verknüpft werden
select a.val,b.val from a join b on (a.key = b.key1) join c on (c.key = b.key2);
  1. Hive konvertiert Joins für mehrere Tabellen in einen einzigen MR-Job, wenn jede Tabelle dieselben Spalten in der Join-Klausel verwendet
select a.val,b.val,c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1);
  1. Die letzte Tabelle in einem Join wird durch den Reduzierer gestreamt, wo andere Tabellen davor gepuffert werden. Wenn Sie also große Tabellen an letzter Stelle platzieren, können Sie den Speicherbedarf reduzieren, der zum Zwischenspeichern von Daten in der Reduziererstufe erforderlich ist
  2. Beim Beitritt können Sie die zu streamende Tabelle über die Syntax-STREAMTABLE-Eingabeaufforderung angeben. Wenn der STREAMTABLE-Hinweis weggelassen wird, streamt Hive die Tabelle ganz rechts
select /*+ STREAMTABLE(a) */ a.val,b.val,c.val from a join b on (a.key = b.key1) join c on (c.key = b.key1);
-- a,b,c三个表都在一个MR作业中连接,并且表b和c的键特定的值被缓冲在reducer的缓存中
-- 然后,对于从a中检索到的每一行,将使用缓冲的行来计算连接,如果省略STREAMTABLE提示,则Hive将流式传输最右边的表
  1. Der Join wird vor der WHERE-Bedingung durchgeführt
  2. Wenn bis auf eine alle zu verknüpfenden Tabellen klein sind, kann dies als Nur-Map-Job (Mapjoin) ausgeführt werden.
select /*+ MAPJOIN(b)*/ a.key,a.value from a join b on a.key = b.key;
-- 不需要reducer,对于A的每个Mapper,B都会被完全读取,限制是不能执行FULL/RIGHT OUTER JOIN b

Guess you like

Origin blog.csdn.net/hutc_Alan/article/details/131481136