web-dev-qa-db-ja.com

sqoopを使用してデフォルトのHive区切り出力をエクスポートするにはどうすればよいですか?

Hiveクエリがあります:

insert override directory /x
select ...

次に、sqoopを使用してデータをエクスポートしようとしています

sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by 0x01 --lines-terminated-by '\n'

しかし、これは区切り文字に従ってフィールドを解析できないようです。何が欠けていますか? -input-fields-terminated-by 0x01部分が期待どおりに機能しないと思いますか?

クエリ結果を含む追加のテーブルをHiveに作成したくありません。

スタックトレース:

 2013-09-24 05:39:21,705 ERROR org.Apache.sqoop.mapreduce.TextExportMapper: Exception: 
 Java.lang.NumberFormatException: For input string: "9-2"
    at Java.lang.NumberFormatException.forInputString(NumberFormatException.Java:48)
    at Java.lang.Integer.parseInt(Integer.Java:458)
 ...

出力のviビュー

16-09-2013 23^A1182^A-1^APub_X^A21782^AIT^A1^A0^A0^A0^A0^A0.0^A0.0^A0.0
16-09-2013 23^A1182^A6975^ASoMo Audience  Corp^A2336143^AUS^A1^A1^A0^A0^A0^A0.2^A0.0^A0.0
16-09-2013 23^A1183^A-1^APub_UK, Inc.^A1564001^AGB^A1^A0^A0^A0^A0^A0.0^A0.0^A0.0
17-09-2013 00^A1120^A-1^APub_US^A911^A--^A181^A0^A0^A0^A0^A0.0^A0.0^A0.0
10
Julias

Bashでその特殊文字の正しい解決策を見つけました

#!/bin/bash

# ... your script
Hive_char=$( printf "\x01" )

sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by ${Hive_char} --lines-terminated-by '\n'

問題は正しいセパレーター認識(タイプとスキーマとは関係ありません)にあり、それはHive_charによって達成されました。

Linuxでこの特殊文字をコマンドラインにエンコードするもう1つの可能性は、Cntr + V + Aと入力することです。

11
Julias

使用する

--input-fields-terminated-by '\001' --lines-terminated-by '\n'

sqoopexportコマンドのフラグが私にとってはうまくいくようです。

したがって、あなたの例では、完全なコマンドは次のようになります。

sqoop export --connect jdbc:mysql://mysqlm/site --username site --password site --table x_data --export-dir /x  --input-fields-terminated-by '\001' --lines-terminated-by '\n'
3
Mark Grover

DataTypeがRDBMSスキーマと一致していないと思います。

「9-2」値の列名を見つけて、RDBMSスキーマのデータ型を確認してください。

その整数または数値の場合、Sqoopは値を解析して挿入します。そして、どうやら「9-2」は数値ではありません。

これが機能しない場合はお知らせください。

0
user2819053

Sqoopは区切り文字として「0」を使用しているようです。次の理由でエラーが発生します。-mysqlテーブルの最初の列がvarcharであり、2番目の列が数値である可能性があります。以下の文字列のとおり:-

16- 9-2 13 23 ^ A1182 ^ A-1 ^ APub_X ^ A21782 ^ AIT ^ A1 ^ A0 ^ A0 ^ A0 ^ A0 ^ A0.0 ^ A0.0 ^ A0.0

Sqoopによって解析される最初の列は:-16-で、2番目の列は:-9-2です。

したがって、quotes( '0x01')またはで区切り文字を指定することをお勧めします。

(常に簡単で、より適切に制御できます)use Hive create table command as:-'\ t'で終了するテーブルtablename行形式の区切りフィールドをselect ...として作成し、 '\ t'を区切り文字として指定しますsqoopコマンドで。

0
Ankit Singhal