web-dev-qa-db-fra.com

Analyser les lignes HTables pour une valeur de colonne spécifique à l'aide du shell HBase

Je veux numériser des lignes dans un HTable à partir de hbase Shell où une famille de colonnes (i.e., Tweet) a une valeur particulière (i.e., user_id).

Maintenant, je veux trouver toutes les lignes où Tweet: user_id a la valeur test1 car cette colonne a la valeur 'test1'

column=Tweet:user_id, timestamp=1339581201187, value=test1

Bien que je puisse numériser la table pour une utilisation particulière,

scan 'tweetsTable',{COLUMNS => 'Tweet:user_id'}

mais je n'ai trouvé aucun moyen de numériser une ligne pour une valeur.

Est-il possible de le faire via HBase Shell?

J'ai également vérifié cette question .

33
Nishu Tayal

C'est possible sans Hive:

scan 'filemetadata', 
     { COLUMNS => 'colFam:colQualifier', 
       LIMIT => 10, 
       FILTER => "ValueFilter( =, 'binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>' )" 
     }

Remarque: afin de trouver toutes les lignes qui contiennent test1 comme valeur spécifiée dans la question, utilisez préfixe binaire: test1 dans le filtre (voir cette réponse pour plus d'exemples)

43
stu s

Nishu, voici la solution que j'utilise périodiquement. Il est en fait beaucoup plus puissant que ce dont vous avez besoin en ce moment, mais je pense que vous utiliserez son pouvoir un jour. Oui, c'est pour HBase Shell.

import org.Apache.hadoop.hbase.filter.CompareFilter
import org.Apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.Apache.hadoop.hbase.filter.SubstringComparator
import org.Apache.hadoop.hbase.util.Bytes

scan 'yourTable', {LIMIT => 10, FILTER => SingleColumnValueFilter.new(Bytes.toBytes('family'), Bytes.toBytes('field'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('AAA')), COLUMNS => 'family:field' }

Seule la colonne family:field Est renvoyée avec un filtre appliqué. Ce filtre pourrait être amélioré pour effectuer des comparaisons plus compliquées.

Voici également des conseils que je considère comme les plus utiles:

22

Comme il y avait plusieurs demandes d'explication cette réponse cette réponse supplémentaire a été publiée.

Exemple 1

Si

scan '<table>', { COLUMNS => '<column>', LIMIT => 3 }

retournerais:

ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3

puis ce filtre:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter( =, 'binaryprefix:hello_value2') AND ValueFilter( =, 'binaryprefix:hello_value3')" }

retournerais:

ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3

Exemple 2

Sinon est également pris en charge:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter( !=, 'binaryprefix:hello_value2' )" }

retournerais:

ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
12
030

Un exemple de recherche de texte pour une valeur BIGBLUE dans la table t1 avec la famille de colonnes d: a_content. Un scan du tableau montrera toutes les valeurs disponibles: -

scan 't1'
...
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
...

Pour rechercher juste une valeur de BIGBLUE avec une limite de 1, essayez la commande ci-dessous: -

scan 't1',{ COLUMNS => 'd:a_content', LIMIT => 1, FILTER => "ValueFilter( =, 'regexstring:BIGBLUE' )" }

COLUMN+CELL
column=d:a_content, timestamp=1404399246216, value=BIGBLUE

Évidemment, la suppression de la limite affichera toutes les occurrences de ce tableau/cf.

6
John Cooper

Pour analyser une table dans hbase sur la base de n'importe quelle valeur de colonne, SingleColumnValueFilter peut être utilisé comme:

scan 'tablename' ,
   { 
     FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" 
   } 
1
Rahul

De HBAse Shell, je pense que ce n'est pas possible car il s'agit en quelque sorte d'une requête à partir de laquelle nous utilisons voulons trouver des données spécifiques. Comme tout ce que nous savons, HBAse est noSQL, donc lorsque nous voulons appliquer une requête ou si nous avons un cas comme vous, je pense que vous devriez utiliser Hive ou PIG alors que Hive est une bonne approche silencieuse car dans PIG, nous devons jouer avec des scripts.
Quoi qu'il en soit, vous pouvez obtenir de bonnes informations sur Hive d'ici Intégration de Hive avec HBase et Ici
Si votre seul but est de visualiser les données à ne pas obtenir du code (de n'importe quel client), vous pouvez utiliser HBase Explorer ou un nouveau et très bon produit mais il est dans sa version bêta "HBase manager". Vous pouvez l'obtenir auprès de HBase Manager
Son simple, et plus important encore, il aide à insérer et supprimer des données, en appliquant des filtres sur les qualificateurs de colonne de l'interface utilisateur comme d'autres DBclients. Essaye.
J'espère que cela vous sera utile :)

0
khan