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
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と入力することです。
使用する
--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'
DataTypeがRDBMSスキーマと一致していないと思います。
「9-2」値の列名を見つけて、RDBMSスキーマのデータ型を確認してください。
その整数または数値の場合、Sqoopは値を解析して挿入します。そして、どうやら「9-2」は数値ではありません。
これが機能しない場合はお知らせください。
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コマンドで。