2016-06-21 56 views
0

我有一個4列的hbase表。我想在column1中搜索一個字符串,並從每一行中獲取column2的值,在那裏我得到一個匹配。我與這兩個代碼線工作結合幾個hbase shell命令

掃描 '表',{COLUMNS => '列1',FILTER => 「ValueFilter(=, '子:值')」}

接着的foreach行:得到'table',$ row,{COLUMNS =>'column2'}

如何通過執行一條命令獲得結果(例如'value1,value2,value3')?

問候 N3

回答

1

我想你可以從HBase的外殼內使用SingleColumnValueFilter。

scan 'table', {COLUMNS => ['cf:column1', 'cf:column2'], FILTER => "SingleColumnValueFilter('cf', 'column1', =, 'substring:value', true, true)"} 

首先trueSingleColumnValueFilter表示filterIfColumnMissing和第二true表示setLatestVersionOnly

+0

感謝您的幫助,但我得到了以下錯誤: '錯誤:不正確過濾字符串SingleColumnValueFilter( 'COL1',=, '子:foobar的',真的,真)' 任何想法? –

+0

列是否屬於列家族? '{COLUMNS => ['cf1:column1','cf2:column2'],FILTER =>「SingleColumnValueFilter('cf1','column1',=''substring:value',true,true)」} – Kadir

+0

否,我只有4列沒有列家庭。我需要一個專欄系列,還是沒有? –

1

可以通過管道命令從BASH(或任何其它的unix殼)HBase的殼。從那裏你可以創建一個單行命令或更好的腳本來執行你需要的任務。

例如,您可以用得到匹配值的所有行的列表:

echo "scan 'table', { COLUMNS => 'column1', FILTER => \"ValueFilter(=, 'substring:value')\"}" | hbase shell 2>/dev/null | awk '{print $1}' 

注:不要忘了逃跑焦炭\周邊ValueFilter

雙引號

編輯: 這是一個腳本,它將找到列1中包含特定字符串值的所有行,然後獲得這些行的列2內的值:

#!/usr/bin/env bash 

# Set variables according to your environment 
TABLE="table" 
COLUMN1="column1" 
COLUMN2="column2" 

TEMP="/tmp/temp" 
OUTPUT="/tmp/output.txt" 
LIMIT=100000000 # Set limit for table scan 
VALUE=$1   # The string value to search 

if [ -z $1 ]; then 
    echo -e "MISSING PARAMENTER!\nUsage: $0 search_string" 
    exit 1 
fi 

# Get all the row names that match $VALUE in $COLUMN1 of $TABLE and store in $TEMP file 
echo "scan '$TABLE', { COLUMNS => '$COLUMN1', LIMIT => $LIMIT, FILTER => \"ValueFilter(=, 'substring:$VALUE')\"}" | hbase shell 2>/dev/null | grep -v "^$" > $TEMP 

NUM_OF_ROWS=$(cat $TEMP | grep "row(s)" | awk '{print $1}') 
LAST_ROW=$(($(cat $TEMP | grep -n "row(s)" | awk -F ":" '{print $1}')-1)) 
FIRST_ROW=$(($LAST_ROW-$NUM_OF_ROWS+1)) 

if [ -z $FIRST_ROW ]; then 
    echo "SOMETHING WENT WRONG, EXITING" 
    exit 1 
fi 

# Clear $OUTPUT file 
echo "SEARCH RESULTS" > $OUTPUT 

for ROW in $(cat $TEMP | awk '{print $1}' | sed -n ${FIRST_ROW},${LAST_ROW}p) 
do 
    echo "get '$TABLE','$ROW',{ COLUMNS => '$COLUMN2'}" | hbase shell 2>/dev/null | grep "value" >> $OUTPUT 
done 

# Optional cleanup 
# rm -f $TEMP 

echo "SEARCH COMPLETE, RESULTS STORED IN $OUTPUT" 

exit 0 

要使用該腳本,只需使用一個參數指示要搜索的字符串值執行它即可。

這不是特別快,但它完成了工作。