Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 组合几个hbase shell命令_Bash_Shell_Hbase - Fatal编程技术网

Bash 组合几个hbase shell命令

Bash 组合几个hbase shell命令,bash,shell,hbase,Bash,Shell,Hbase,我有一个包含4列的hbase表。我想在column1中搜索一个字符串,并从每一行中获取column2的值,在这一行中我得到一个匹配项。我使用这两个代码行 扫描'table',{COLUMNS=>'column1',FILTER=>“ValueFilter=,'substring:value')”} 然后foreach行:get'table',$row,{COLUMNS=>'column2'} 如何仅通过执行一个命令获得结果(例如“value1、value2、value3”) 致意 n3我认为可以

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

扫描'table',{COLUMNS=>'column1',FILTER=>“ValueFilter=,'substring:value')”}

然后foreach行:get'table',$row,{COLUMNS=>'column2'}

如何仅通过执行一个命令获得结果(例如“value1、value2、value3”)

致意
n3

我认为可以从hbase外壳内部使用SingleColumnValueFilter

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

第一个
true
SingleColumnValueFilter
中表示
FilterIfcColumnMissing
,第二个
true
表示
setLatestVersionOnly

我认为可以从hbase外壳内部使用SingleColumnValueFilter

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

SingleColumnValueFilter
中的第一个
true
表示
filterifccolumnsmissing
,第二个
true
表示
setlatestversiononononOnly
您可以从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
要使用脚本,只需使用一个指示要搜索的字符串值的参数执行脚本


虽然速度不是特别快,但它完成了任务。

您可以从BASH(或任何其他unixshell)通过管道将命令发送到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
要使用脚本,只需使用一个指示要搜索的字符串值的参数执行脚本


虽然速度不是特别快,但它完成了任务。

谢谢您的帮助,但我遇到了以下错误:
错误:不正确的筛选字符串SingleColumnValueFilter('col1',=,'substring:foobar',true,true)
有什么想法吗?该列是否属于列族<代码>{COLUMNS=>['cf1:column1','cf2:column2'],FILTER=>“SingleColumnValueFilter('cf1','column1',=,'substring:value',true,true)”}不,我只有4列,没有列族。我需要一个列族,还是也可以没有?据我所知,每个hbase表都必须包含一个cf。请看一看,感谢您的帮助,但我得到以下错误:
错误:错误的筛选字符串SingleColumnValueFilter('col1',=,'substring:foobar',true,true)
知道该列属于一个列族吗<代码>{COLUMNS=>['cf1:column1','cf2:column2'],FILTER=>“SingleColumnValueFilter('cf1','column1',=,'substring:value',true,true)”}不,我只有4列,没有列族。我需要一个列族,还是也可以没有?据我所知,每个hbase表都必须包含一个cf。请看