我有一个4列的hbase表。我想在column1中搜索一个字符串,并从每一行中获取column2的值,在那里我得到一个匹配项。我使用这两条代码线扫描'table',{columns=>'column1',filter=>“valuefilter=,'substring:value')"}然后foreach行:get'table',$row,{columns=>'column2'}如何通过只执行一个命令来获得结果(例如“value1,value2,value3”)?致以最诚挚的问候n3
chy5wohz1#
可以通过管道将命令从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
要使用该脚本,只需使用一个指示要搜索的字符串值的参数来执行它。它不是特别快,但它完成了任务。
yyyllmsg2#
我认为可以从hbase shell内部使用singlecolumnvaluefilter。
scan 'table', {COLUMNS => ['cf:column1', 'cf:column2'], FILTER => "SingleColumnValueFilter('cf', 'column1', =, 'substring:value', true, true)"}
第一 true 在 SingleColumnValueFilter 表示 filterIfColumnMissing 第二个呢 true 表示 setLatestVersionOnly
true
SingleColumnValueFilter
filterIfColumnMissing
setLatestVersionOnly
2条答案
按热度按时间chy5wohz1#
可以通过管道将命令从bash(或任何其他unix shell)传输到hbase shell。从那里你可以创建一个单行命令或者更好的脚本来执行你需要的任务。
例如,可以使用以下方法获取与值匹配的所有行的列表:
注意:不要忘记转义字符
\
对于valuefilter的双引号编辑:下面是一个脚本,它将在column1中查找包含特定字符串值的所有行,然后在column2中获取这些行的值:
要使用该脚本,只需使用一个指示要搜索的字符串值的参数来执行它。
它不是特别快,但它完成了任务。
yyyllmsg2#
我认为可以从hbase shell内部使用singlecolumnvaluefilter。
第一
true
在SingleColumnValueFilter
表示filterIfColumnMissing
第二个呢true
表示setLatestVersionOnly