结合几个hbase shell命令

时间:2016-06-21 12:06:03

标签: bash shell hbase

我有一个包含4列的hbase表。我想在column1中搜索一个字符串,并从每一行获取column2的值,我得到一个匹配项。我使用这两个代码行

扫描'表',{COLUMNS => ' column1',FILTER => " ValueFilter(=,' substring:value')"}

然后是foreach行:获取' table',$ row,{COLUMNS => '列2'}

如何通过只执行一个命令来获得结果(例如' value1,value2,value3')?

最好的问候 N3

2 个答案:

答案 0 :(得分:1)

我认为您可以在hbase shell中使用SingleColumnValueFilter。

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

true中的第一SingleColumnValueFilter代表filterIfColumnMissing,第二true代表setLatestVersionOnly

答案 1 :(得分:1)

您可以从BASH(或任何其他unix shell)将命令传递给HBase shell。从那里你可以创建一个单行命令或更好的脚本来执行你需要的任务。

例如,您可以使用以下命令获取与值匹配的所有行的列表:

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

注意:请勿忘记ValueFilter周围双引号的转义字符\

修改 这是一个脚本,它将在column1中找到包含特定字符串值的所有行,然后在column2中获取这些行的值:

#!/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

要使用该脚本,只需使用一个参数指示要搜索的字符串值即可执行该脚本。

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