可以通过管道命令从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
要使用该脚本,只需使用一个参数指示要搜索的字符串值执行它即可。
这不是特别快,但它完成了工作。
感谢您的帮助,但我得到了以下错误: '错误:不正确过滤字符串SingleColumnValueFilter( 'COL1',=, '子:foobar的',真的,真)' 任何想法? –
列是否属于列家族? '{COLUMNS => ['cf1:column1','cf2:column2'],FILTER =>“SingleColumnValueFilter('cf1','column1',=''substring:value',true,true)”} – Kadir
否,我只有4列没有列家庭。我需要一个专栏系列,还是没有? –