5

大量のデータが含まれる既存のテーブルが多数ある HBase インストールがあります (これを削除したくありません)。最近、Apache Phoenix を使用して HBase データを SQL に似た構文でクエリできることに気付きましたが、これまでのところ素晴らしいです。ただし、さまざまなデータ型と、それらが HBase に格納した Java 型にどのようにマッピングされるかについては、まだ完全に理解していないため、時々誤解することがあります。保存した HBase 列がある場合

Bytes.toBytes(Long long)

Phoenix 列を誤って varchar として作成してしまいました。すべてのデータを失うことなく Phoenix 列を変更するにはどうすればよいですか? 私が行った場合

alter table "mytable" add "myfamily"."mycolumn" unsigned_long

その後

alter table "mytable" drop column "mycolumn"

そしてその後

alter table "mytable" add "myfamily"."mycolumn" varchar

すべての HBase データが、基になる "mycolumn" 列から消去されます! これを回避する最善の方法は何ですか?

パラメータの設定について読みました

phoenix.schema.dropMetaData

これはまさに私が望むもののように聞こえますが、実際にこれをどこに設定したのかわかりません。これを false に設定するために Phoenix にログオンしたときに Squirrel で発行できるコマンドはありますか? それとも環境変数ですか?

助けてくれてありがとう!

編集1

Phoenix で各型の列を含むダミー テーブルを作成し、それを system.catalog テーブルで検索して、各データ型を表す数値を取得しました。次に、次のコマンドを使用しました

upsert into system.catalog (table_name, column_name, column_family, data_type) values ('mytable','mycolumn','mycf',3)

mycolumn のタイプを 10 進数に変更します。ただし、mytable にクエリを実行すると、mycolumn の型は unsigned_long のままです。この値を更新した後、HBase を再起動する必要があるのでしょうか?

ご参考までに:

COLUMN_NAME DATA_TYPE
MYTINYINT   -6
MYBIGINT    -5
MYDECIMAL   3
MYINTEGER   4
MYFLOAT 6
MYDOUBLE    8
MYUINTEGER  9
MYULONG 10
MYUTINYINT  11
MYVARCHAR   12
ROWID   12
MYUFLOAT    14
MYUDOUBLE   15
MYBOOLEAN   16
MYUTIME 18
MYUDATE 19
MYUTIMESTAMP    19
MYDATE  91
MYTIME  92
MYTIMESTAMP 93

編集2

SYSTEM.CATALOG および SYSTEM.STATS からテーブルのすべてのエントリを削除することで、基になる HBase テーブルに触れることなく、Phoenix からテーブルを取り除くことができるようです。その後、目的の列タイプでテーブルを再作成できます。これが私の HBase テーブルに恐ろしい悪影響を与えるかどうかはまだわかりません!

4

2 に答える 2

1

Phoenix は、すべてのテーブルのメタデータを SYSTEM_CATALOG という別の HBase テーブルに保存します。このパラメーター phoenix.schema.dropMetaData
は、ALTER コマンドが指定されたときにメタデータを強制的にカタログ表から削除します。

false に設定すると、次に同じ名前のテーブルを作成するときに、TableAlreadyExistsException が発生し続けます。

于 2015-02-13T01:25:19.263 に答える
0

おそらく、最初にその列を削除してから、同じ名前の新しい列を追加できます。

ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname varchar(100);
于 2015-09-07T06:54:24.077 に答える