HIVEのテーブル定義の確認

LanguageManual DDL - Apache Hive - Apache Software Foundation

テーブル定義の確認方法

HIVEで作成したテーブルのファイルフォーマットや構成を確認したい場合

hive > desc [ extended / formatted ] テーブル名

extendedで詳細説明表示
formattedで見やすいよう整形してくれる

> CREATE TABLE test_table(col1 string, col2 string, col3 string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
OK

> desc formatted test_table;

# col_name              data_type               comment

col1                    string                  None
col2                    string                  None
col3                    string                  None

# Detailed Table Information
Database:               mra
Owner:                  hadoop
CreateTime:             Thu Nov 11 00:00:00 UTC 2013
LastAccessTime:         UNKNOWN
Protect Mode:           None
Retention:              0
Location:               hdfs://hoge/foo/bar/test_table
Table Type:             MANAGED_TABLE
Table Parameters:
        transient_lastDdlTime   1234567890

# Storage Information
SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat:            org.apache.hadoop.mapred.TextInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
Compressed:             No
Num Buckets:            -1
Bucket Columns:         []
Sort Columns:           []
Storage Desc Params:
        field.delim             \t
        line.delim              \n
        serialization.format    \t

BASHで二次元配列

BASHで二次元配列もどきの作り方
#!/bin/bash

arrays=(
"aaa 111"
"bbb 222 333"
"ccc"
)

for array in "${arrays[@]}"
do
    echo "${array}"
    for hoge in "${array}"
    do
        echo "${hoge}"
    done
done

結果

aaa 111
aaa
111
bbb 222 333
bbb
222
333
ccc
ccc

テストケース等をfor文で回したい時

#!/bin/bash

arrays=(
"test.sh arg1"
"test2.sh arg1 arg2"
"test3.sh"
)

for array in "${arrays[@]}"
do
     "${array}"
done

リターンコードを取得

BASHでリターンコードを取得

$?で直前のコマンドのリターンコードを取得できる

mkdir hoge
echo "$?"
  • リターンコード
    成功 -> 0
    失敗 -> 1
リターンコードの受け取り方

実行に失敗した場合に呼び出し元に返り値をそのまま返したい時

#!/bin/bash

function hoge(){
    mkdir hoge
    # ディレクトリ作成に失敗したら返り値を返して抜ける
    if [ $? -ne 0 ];then
        exit "$?"
    fi
    # 処理の続き...
}

echo "`hoge`"

とやると上手くいかない

$?は直前のコマンド実行結果を拾ってくるらしい
この場合、exit "$?"で返されるのはif文の条件整合結果

#!/bin/bash

function hoge(){
    mkdir hoge
    # ディレクトリ作成に失敗したら返り値を返して抜ける
    result=$?
    if [ ${result} -ne 0 ];then
        exit "${result}"
    fi
    # 処理の続き...
}

echo "`hoge`"

こんな感じで受け取ってやればOK

Perlの変数宣言

our, my, local

  • our. パッケージ変数
    スコープの外からでもパッケージ名をつけて参照できる

  • my. レキシカルスコープ
    スコープ内で参照可能な変数を宣言

  • local. ダイナミックスコープ
    グローバルな変数がいた場合一時スタックに退避
    実行時のスコープ内で宣言した値を持つ

スコープ

  • {} で囲われた範囲
    localやmyはスコープを外れた場所から参照できない

レキシカルスコープとダイナミックスコープ

  • レキシカルスコープ

静的なスコープ
コードに書かれた {} 内でのスコープ

our $hoge;
sub B{
    return $hoge;
}
sub A{
    my $hoge;
    return B;
}

Aのみで参照可能

  • ダイナミックスコープ

動的スコープ
実行時のスコープで参照可能

our $hoge;
sub B{
    return $hoge;
}
sub A{
    local $hoge;
    return B;
}

実行時A内でBが呼ばれるので、AB内で参照可能

ちょっと分かり難かったので検証

#!/usr/local/bin/perl

package test;

use strict;
use warnings;

our $hoge = "hello";

sub localtest
{
        local $hoge = "good";
        print "localtest\n";
        print "$hoge\n";
        print "$test::hoge\n";
}

sub mytest
{
        my $hoge = "good";
        print "mytest\n";
        print "$hoge\n";
        print "$test::hoge\n";
}

mytest;
localtest;

実行結果

localtest
good
good
mytest
good
local

localはパッケージ変数に(元値はスタックに退避して)上書き
myは別に同名の変数を持つみたい

参照

http://d.hatena.ne.jp/TAKESAKO/20080110/1199969773 http://d.hatena.ne.jp/perlcodesample/20110128/1300165343