Avro データを使用して Hive テーブルを作成するには、少なくとも 2 つの異なる方法があります。
Avro スキーマに基づくテーブルの作成 (この例では、hdfs に格納されています):
CREATE TABLE users_from_avro_schema ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive .ql.io.avro.AvroContainerOutputFormat' TBLPROPERTIES ('avro.schema.url'='hdfs:///user/root/avro/schema/user.avsc');
STORED AS AVRO
句で明示的にハイブ列を指定してテーブルを作成する:CREATE TABLE users_stored_as_avro( id INT, name STRING ) STORED AS AVRO;
最初のケースでは、users_from_avro_schema
テーブルのメタデータは Hive メタストアに格納されていませんが、avro スキーマ ファイルを読み取る SERDE クラスから推測されていることは正しいですか? または、テーブルのメタデータがメタストアに格納され、テーブルの作成時に追加される可能性がありますが、Hive メタデータを Avro スキーマと同期するためのポリシーは何ですか? 私は両方のケースを意味します:
- テーブル メタデータの更新 (列の追加/削除) および
- プロパティを変更して Avro スキーマを更新し
avro.schema.url
ます。
呼び出した 2 番目のケースDESCRIBE FORMATTED users_stored_as_avro
では、avro.schema.*
プロパティが定義されていないため、データの読み取り/書き込みにどの Avro スキーマが使用されているかわかりません。メタストアに格納されているテーブルのメタデータに基づいて動的に生成されますか?
プログラミング Hive ブックのこのフラグメントでは、SerDe クラスからの列に関する情報を推測する方法について説明していますが、HIVE-4703from deserializer
では、列のコメントからこの情報を削除しています。特定のテーブル (Metastore または Avro スキーマ) の列タイプのソースを確認するにはどうすればよいですか?