hadoop --- ruche

       Hive est un entrepôt de données et un outil d'analyse construit sur Hadoop. Il fournit un langage de requête de type SQL - HiveQL, qui est utilisé pour convertir les requêtes SQL structurées en tâches MapReduce et Tez, grâce à la capacité informatique distribuée de Hadoop d'effectuer des tâches de requête. La synchronisation de la ruche peut synchroniser les données du fichier hdfs avec la table externe pour l'analyse des données.

 définition de la structure de la table hive : 

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name (
  column1 data_type,
  column2 data_type,
  ...
)
[COMMENT 'table_comment']
[PARTITIONED BY (partition_column data_type, ...)]
[CLUSTERED BY (col_name, col_name, ...) 
    [SORTED BY (col_name [ASC|DESC], ...)] 
        INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[TBLPROPERTIES (property_name=property_value, ...)]
[LOCATION 'hdfs_path'];

        Hive utilise l'instruction de création de table de HiveQL et DDL pour définir la structure de la table. DDL peut être utilisé pour créer, modifier et supprimer les métadonnées des tables Hive, y compris les noms de table, les définitions de colonne, les définitions de partition et les formats de stockage. La syntaxe ici est la même que celle de l'instruction de création de table SQL standard.

  • EXTERNAL : facultatif, utilisé pour créer des tables externes
  • IF NOT EXISTS : Facultatif, si la table existe déjà, elle ne sera pas créée. Identique à l'utilisation SQL standard
  • table_name : indiquez le nom de la table à créer
  • colonne1, colonne2 : le nom de la colonne de la table et le type de données de la colonne
  • COMMENT "table_commend": facultatif, utilisé pour commenter la signification du tableau
  • PARTITIOND BY (partition_column data_type, ......) : facultatif, définissez les colonnes de partition et les types de données correspondants
  • CLUSTERED BY (column1, column2, ...) : facultatif, spécifiez la colonne de clustering
  • STORTED BY(olumn1 [ASC] [DESC] , .....) : Facultatif, spécifiez le classement
  • INTO num_buckets BUCKETS : facultatif, spécifiez le nombre de compartiments pour la table en cluster et une division plus fine.
  • ROW FROM row_format : facultatif, définit le format de ligne (délimité, serde)
    • DELIMITED : indique que la classe par défaut LazySimpleSerDe est utilisée pour traiter les données, généralement utilisée pour les fichiers texte séparés par des délimiteurs, et que Serde natif est utilisé par défaut
    • SERDE : Raccourci pour Serializer/Deserializer, utilisé pour la sérialisation et la désérialisation d'objets. Hive utilise SERDE pour lire et écrire des objets de ligne. La lecture consiste à désérialiser les fichiers hdfs en objets, et l'écriture est la sérialisation d'objets et le stockage de hdfs
  • STORED AS file_format : facultatif, définit le format de stockage. La conversion du format de données sous-jacent dépend de SERDE
    • TextFile : format par défaut, stocké au format texte
    • SequenceFile : stocké sous la forme d'un fichier sérialisé binaire compressé
    • RcFile : stocké sous forme de fichier compressé binaire, avec une efficacité élevée, un faible encombrement et une requête rapide, mais ne peut pas visualiser les données, prend beaucoup de temps pour importer des données et ne peut pas utiliser load pour charger des données
    • ORC : il s'agit d'une amélioration de RcFile, qui a été amélioré en termes de codage de compression et de performances de requête
    • Parquet : par rapport à ORC, il prend en charge le stockage de structures imbriquées, telles que les structures JSON, mais ne prend pas en charge la mise à jour, l'ACID et la visualisation des données.
  • LOCATION 'hdfs_path' : facultatif, spécifiez le chemin hdfs de la table
  • TBLPROPERTIES(nom_propriété=valeur_propriété) : Facultatif, définit les propriétés au niveau de la table. Il peut être utilisé pour définir toutes les propriétés que nous avons mentionnées ci-dessus, telles que TBLPROPERTIES('EXTERNAL'='TRUE', 'LOCATION'='/data/hdfs/data',...);

type de données de la ruche : 

  • type de données de base
    • Types d'entiers : TINYINT, SMALLINT, INT, BIGINT
    • Types de virgule flottante : FLOAT, DOUBLE
    • Type booléen : BOOLÉEN
    • Type de chaîne : STRING
    • Type de date : DATE, HORODATAGE
  • type de données complexe
    • Type de tableau : ARRAY<type_données>
    • Type de structure : STRUCT< col_name : data_type [ comment 'col_comment' ] , ........ >
    • Map类型:MAP<type_clé, type_valeur>
  • autres types spéciaux
    • Type NULL : NULL
    • Type binaire : BINAIRE
    • Type décimal : DECIMAL (précision, échelle)
    • Type VARCHAR : VARCHAR (longueur)
    • Type CHAR : CHAR (longueur)

table externe de la ruche, table de gestion :

Tableau externe : 

        Il n'est pas directement lié à un fichier dans un magasin de données tel que HDFS. Hive ne connaît la structure des données qu'en spécifiant l'emplacement du fichier.

  • Les fichiers de données des tables externes peuvent se trouver dans HDFS ou dans le système de fichiers local.
  • La suppression d'une table externe ne supprime pas les fichiers de données sous-jacents.
  • Les données de la table externe peuvent être chargées par le système externe, ce qui signifie que le fichier de données peut être mis à jour directement dans le système externe et que Hive peut directement lire les dernières données.
  • Les tables externes peuvent être partagées entre plusieurs instances Hive.

Tableau géré :

        Une table de gestion est une table définie dans Hive, et ses données et sa définition de table sont gérées par Hive.

  • Les fichiers de données des tables de gestion sont stockés par défaut dans l'entrepôt de données Hive.
  • La suppression de la table de gestion supprimera les données sous-jacentes ensemble, car les données sont gérées par Hive.
  • Les données de la table de gestion ne peuvent être chargées et mises à jour que par Hive.

        Pour les tables externes, vous pouvez utiliser LOAD DATAdes instructions pour charger des données, et pour les tables gérées, vous pouvez utiliser INSERT INTOdes instructions régulières pour insérer des données.

partition de ruche, compartiment : 

Cloison:

        Le partitionnement consiste à stocker les données d'une table en utilisant la valeur du champ partition comme un répertoire. Il peut réduire la plage d'analyse des données du disque et réduire les E/S ; stocker les données dans plusieurs répertoires de partition pour faciliter la gestion des données.

  • Partition statique : créez une table de partition selon PARTITIONED BY et spécifiez un champ de partition. Le champ de partition ne stocke pas de données réelles, mais n'est qu'une représentation de la partition.
    • Partition unique : Partition selon la valeur d'une colonne, la gestion et la requête sont relativement simples, adaptées aux modèles de données simples
    • Multi-partition : le partitionnement en fonction des valeurs de plusieurs colonnes peut fournir des options de requête plus flexibles
  • Partition dynamique : la valeur de la partition n'est connue qu'au moment de son exécution. Par rapport à la partition statique, les données de plusieurs partitions peuvent être écrites en même temps, au lieu d'effectuer plusieurs insertions à chaque écriture de la partition.
    • Dans une requête INSERT...SELECT..., les colonnes de partition dynamique doivent être spécifiées en dernier parmi les colonnes de l'instruction SELECT, et dans l'ordre dans lequel elles apparaissent dans la clause PARTITION()
    • Si des partitions dynamiques et des partitions statiques sont utilisées ensemble, les champs des partitions statiques doivent venir en premier, et les champs des partitions dynamiques doivent suivre

Syntaxe de partition statique : 

#分区表创建
    #单分区表创建
    CREATE TABLE tmp_xx(id int,name String) partitioned by (d string);

    #多分区表创建
    CREATE TABLE tmp_xx(id int,name String) partitioned by (d String,h String);
 
 
#添加分区
ALTER TABLE tmp_partition ADD IF NOT EXISTS PARTITION (d='20220628')
 
#删除分区
ALTER TABLE tmp_partition DROP IF EXISTS PARTITION (d='20220628')
 
#数据写入
    #单分区数据写入
    INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629')
    SELECT id, name FROM tmp_yy limit 10;
 

    #多分区数据写入
    INSERT OVERWRITE TABLE tmp_xx PARTITION (d='20220629',h='15')
    SELECT id, name FROM tmp_yy limit 10;

#查看分区数据
    #单分区
    select * from tmp_xx where d='20220629'

    #多分区
    select * from tmp_xx where d='20220629' and h='15'

 
#查看表分区
show partitions table;
 
#查看目录
hadoop dfs -du -h /user/hive/warehouse/tmp_xxx

Syntaxe de partition dynamique : 

1. Pour utiliser le partitionnement dynamique, hive doit activer le partitionnement dynamique :

-- 开启动态分区 默认为false,不开启
set hive.exec.dynamic.partition=true;   
-- 指定动态分区模式,默认为strict
set hive.exec.dynamic.partition.mode=nonstrict; 
 
# 下面参数可选
SET hive.exec.max.dynamic.partitions=2048; 
SET hive.exec.max.dynamic.partitions.pernode=256; 
SET hive.exec.max.created.files=10000; 
SET hive.error.on.empty.partition=true;

2. Grammaire : 

#写入数据
INSERT overwrite TABLE tmp_partition PARTITION(d)
SELECT id,NAME,d FROM tmp_xxx
 
#写入多分区数据
INSERT overwrite TABLE tmp_partition PARTITION(d,h)
SELECT id,NAME,d,h FROM tmp_xxx
 
#混合分区使用,使用动态分区和静态分区,静态分区必须在前
INSERT overwrite TABLE tmp_partition PARTITION(d='20220629',h)
SELECT id,NAME,h FROM tmp_xxx

Seau: 

        Par rapport à la table de partition, la table de compartiments divise les données en une division plus fine et est généralement moins utilisée. Lorsque la quantité de données n'est pas importante, l'utilisation de compartiments peut même aggraver les performances.

        La table de compartiment distingue l'intégralité du contenu des données en fonction de la valeur de hachage du champ de compartiment, divise la valeur de hachage par le nombre de compartiments pour obtenir le reste, bucket_id = column.hashcode % bucket.num, le reste détermine l'enregistrement sera Quel seau est attribué. Les enregistrements avec le même reste seront divisés en un seul seau. Il convient de noter qu'en termes de structure physique, un bucket correspond à un fichier et que la table de partition n'est qu'un répertoire. La quantité de données qu'il y a dans le répertoire est incertaine. 

Créez une table de bucket : 

CREATE TABLE tmp_bucket(id INT,NAME STRING) clustered BY (id) INTO 4 buckets

échantillonnage: 

#建表
select columns from table tablesample(bucket x out of y on column);
-- x:表示从第几个分桶进行抽样
-- y:表示每隔几个分桶取一个分桶,y必须为表bucket的整数倍或者因子
 
#从分桶表的建表语句中可知,我们一共分了4个桶,所以我们这里x取1,y取2
一共抽取2(4/2)个桶,从第一个桶开始,每隔2个桶抽取一次,即第一个桶和
第三个桶。
SELECT id,NAME FROM tmp_bucket tablesample(bucket 1 OUT of 2 ON id) LIMIT 10

index de la ruche

        L'indexation dans Hive est implémentée en fonction de la structure de stockage du système de fichiers distribués Hadoop (HDFS). Il crée des fichiers de métadonnées sur HDFS pour suivre l'emplacement et les informations de partition des fichiers de données.

Principe de l'indice de ruche : 

  • Créer un index sur la colonne spécifiée, générer une table d'index (table physique de la ruche), enregistrer la valeur de la colonne d'index, le chemin du fichier hdfs correspondant à la valeur et le décalage dans le fichier correspondant à la valeur
  • Lors de l'exécution d'une requête de champ d'index, Erwait génère d'abord une tâche MapReduce.Selon les conditions de filtrage de la colonne d'index, il filtre le chemin du fichier hdfs et le décalage correspondant à la valeur de la colonne d'index de la table d'index, et le sort pour un fichier dans hdfs. Ensuite, en fonction du chemin hdfs et de l'offset dans ce fichier, filtrez le fichier d'entrée d'origine et générez un nouveau fractionnement en tant que fractionnement de l'ensemble du travail, évitant ainsi l'analyse complète de la table.

Pour faciliter la compréhension, comparons l'index de Hive avec l'index de MySQL :

  1. Méthode de stockage :

    • Index Hive : l'index dans Hive est implémenté en fonction de la structure de stockage du système de fichiers distribués Hadoop (HDFS). Il crée des fichiers de métadonnées sur HDFS pour suivre l'emplacement et les informations de partition des fichiers de données.
    • Index MySQL : l'index MySQL est implémenté sur la base de structures de données telles que l'arborescence B+ ou la table de hachage, et est utilisé pour indexer les données au niveau de la couche moteur de stockage.
  2. Prise en charge des types de données :

    • Index Hive : L'index Hive prend en charge les types de données de base et certaines opérations de types de données complexes, tels que les tableaux et les structures. Mais lorsque vous travaillez avec des types de données complexes, les index peuvent être limités.
    • Index MySQL : l'index MySQL prend en charge un large éventail de types de données, y compris les nombres entiers, les nombres à virgule flottante, les chaînes, les dates, etc.
  3. La cohérence des données:

    • Index Hive : les index Hive sont généralement maintenus paresseusement, en particulier dans les partitions dynamiques. Cela signifie que l'index peut ne pas refléter immédiatement les modifications apportées aux données, mais qu'il est mis à jour à un moment donné.
    • Index MySQL : L'index MySQL sera mis à jour en temps réel lors des opérations de modification des données afin de maintenir la cohérence des données. Cela permet d'obtenir les dernières données lors de l'exécution d'opérations de lecture.
  4. Performances des requêtes :

    • Index Hive : L'index de Hive est principalement utilisé pour filtrer et filtrer les données, ce qui peut aider à réduire la quantité de données interrogées, mais ne peut pas obtenir un positionnement efficace comme MySQL.
    • Index MySQL : L'index MySQL peut localiser rapidement l'emplacement des données requises, améliorant ainsi les performances des requêtes.
  5. Administratif et entretien :

    • Index Hive : L'index Hive est géré et maintenu par Hive lui-même. La création et la suppression d'index nécessitent l'utilisation des instructions DDL de Hive. La création et la maintenance des index Hive nécessitent généralement des opérations supplémentaires et peuvent prendre beaucoup de temps pour les grands ensembles de données et les tables partitionnées dynamiquement.
    • Index MySQL : les index MySQL peuvent être définis et gérés par les développeurs eux-mêmes. Les opérations de création, de suppression et de modification des index sont relativement simples et directes.

1. hive crée un index : 

-- 创建索引

CREATE [UNIQUE] INDEX index_name
ON TABLE table_name
[PARTITIONED BY (col_name, ...)]  -- 指定索引列
[index_type]
[AS index_properties]
[WITH DEFERRED REBUILD]
[STORED AS index_storage_handler]
[TBLPROPERTIES (property_name=property_value, ...)]
[COMMENT 'index_comment'];
  1. UNIQUE : mot-clé facultatif qui spécifie si l'index est un index unique.
  2. PARTITIONED BY (col_name, ...): 指定索引列
  3. index_type: type d'index, tel que BTREE ou BITMAP. Ceci est facultatif, s'il n'est pas spécifié, la valeur par défaut est le type BTREE.
  4. AS index_properties: Paramètre facultatif pour spécifier les propriétés de configuration de l'index. Ces propriétés sont généralement liées au moteur de stockage sous-jacent, généralement à l'aide de org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler
  5. WITH DEFERRED REBUILD: Paramètre facultatif, utilisé pour activer la reconstruction retardée de l'index, c'est-à-dire qu'il s'agit actuellement d'un index vide et que l'amour que vous indexez n'a pas été réellement créé. Lorsque cette option est utilisée, une reconstruction manuelle est requise et l'index sera marqué comme "DEFERRED_REBUILD" après la création.
  6. STORED AS index_storage_handler : Paramètre facultatif pour spécifier le gestionnaire de stockage de l'index. Par exemple, vous pouvez spécifier STORED AS RCFILE pour stocker l'index au format RCFile.
  7.  TBLPROPERTIES (property_name=property_value, ...): paramètre facultatif pour spécifier des attributs supplémentaires au niveau de la table, qui sont généralement liés au moteur de stockage sous-jacent.
  8. COMMENT 'index_comment': Un paramètre facultatif pour fournir des informations d'annotation pour l'index.

2. Générer un index

        La table d'index Hive nouvellement créée ne contient aucune donnée et doit générer des données d'index

alter index 索引名称 on 表名 rebuild;

        Le processus de génération d'un index peut avoir un certain impact sur les ressources système, en particulier pour les grands ensembles de données et les index volumineux. Par conséquent, la charge du système et les ressources disponibles doivent être prises en compte lors de la génération des index.

3. Vérifiez l'indice

SHOW FORMATTED INDEX ON table_name;
SHOW FORMATTED INDEXES ON table_name;

Je suppose que tu aimes

Origine blog.csdn.net/zhoushimiao1990/article/details/131624311
conseillé
Classement