2017-02-20 3 views
0

にMySQLのテーブルにカラムを追加します結果。Sqoopインポートは、新たに、私は以下のようにMySQLでのテーブルのテストを持っている既存のハイブテーブル

はその後、我々は今、私が更新上記の列と行を持つ既存のハイブテーブルをしたい余分な2行

id name address nation 

1 Km sky null 
2 hd heaven null 
3 Ab null null 
4 en null null 
5 abc efd USA 
6 fge cde UK 

でMySQLのテーブルに新しいcolumを追加しました。私は、次のsqoopジョブに

Sqoopの仕事をしている:

sqoop job --create sqoop_test -- import --connect jdbc:mysql:xxxxxxx/testing --username XXXXX --password XXXX --query "SELECT * from testing.test WHERE \$CONDITIONS" --incremental append\ 
--check-column id --last-value "3" --split-by 'id' --target-dir /user/hive/warehouse/testing.db/test 

しかし、私はハイブテーブルのクエリを実行したとき、私は新しい行と新しい列が表示されないためnullとして結果を得ます。以下のように

id name address 

NULL NULL NULL 
NULL NULL NULL 
1 Km sky 
2 hd heaven 
3 Ab 
4 en 

ハイブに新しい列を追加し、既存のテーブルに新しい行を追加するにはどうすればよいですか?

または私が使用している方法は完全に間違っていますか?教えてください

+0

avroデータ型を使用することができます。デルタデータの場合は、増分モード(更新のために最後に変更)をsqoopで使用します。 – marjun

答えて

1

あなたの前提が間違っている理由は、別のレイアウトのデータをインポートするためです。作成した最初のテーブルには3つの列があり、2回目のインポートでは4つの列がインポートされます。そのため、Hiveは新しいレコードを解析できず、単にすべての列に対してnullを出力します。テキストファイル形式でデータをインポートする正当な理由がない場合は、avroで表を作成し、スキーマの進化機能を使用して新しい列を追加することをお勧めします。

avroでデータをインポートすると、Sqoopが自動的にスキームを生成します。必要なのは、インポートされたデータを指すテーブルを作成し、生成されたスキーマを使用することだけです。新しい分野での今後の輸入の場合、あなたは

{ "name": "newcolumnname", "type": [ "null", "string" ], "default": "null" }, 

あるいは他の有効なデフォルトを指定します(文字列のため、たとえば)有効なデフォルト値でこれらのフィールドを追加したり、それらを次のようにデフォルト値をnullables作る必要があります。値

{ "name": "newcolumnname", "type": [ "string" ], "default": "val1" }, //default value 1 
{ "name": "newcolumnname", "type": [ "string" ], "default": "" }, //default value empty 
関連する問題