【问题标题】:Combine few hbase shell commands结合几个 hbase shell 命令
【发布时间】:2016-10-22 23:24:10
【问题描述】:

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

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

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

我怎样才能通过只执行一个命令得到结果(例如'value1, value2, value3')?

最好的问候 n3

【问题讨论】:

    标签: bash shell hbase


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的帮助,但我收到以下错误:ERROR: Incorrect filter string SingleColumnValueFilter('col1', =, 'substring:foobar', true, true) 有什么想法吗?
    • 列是否属于列族? {COLUMNS => ['cf1:column1', 'cf2:column2'], FILTER => "SingleColumnValueFilter('cf1', 'column1', =, 'substring:value', true, true)"}
    • 不,我只有 4 列没有列族。我需要一个列族,还是没有它也可以?
    • 据我所知,每个 hbase 表都必须包含一个 cf。看看hbase.apache.org/book.html#columnfamily
    【解决方案2】:

    您可以将命令从 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
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-10
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      相关资源
      最近更新 更多