このトピックでは、Sqoop の一般的な問題について説明します。
インポート後にタイムスタンプが 8 時間ずれる問題
-
問題
-
例えば、ApsaraDB RDS データソースの test_table テーブルにタイムスタンプフィールドが含まれているとします。DMS でソーステーブル
test_tableをクエリすると、結果にはid列とapplied_at列を持つ 5 つのレコードが含まれます。applied_at列の値は 2024-06-14 10:08:04 から 2024-06-18 10:08:04 までの範囲です (時刻は 10:08:04 に固定され、1 日ずつインクリメントされます)。 -
次のコマンドを実行して、test_table から HDFS にデータをインポートします。
sqoop import \ --connect jdbc:mysql://rm-2ze****341.mysql.rds.aliyuncs.com:3306/s***o_sqoop_db \ --username s***o \ --password ****** \ --table test_table \ --target-dir /user/hadoop/output \ --delete-target-dir \ --direct \ --split-by id \ --fields-terminated-by '|' \ -m 1 -
インポート結果をクエリします。
結果を見ると、HDFS 上のタイムスタンプ フィールドが 8 時間前の時刻になっていることがわかります。
[root@master-1-1(xxx) ~]# hdfs dfs -cat /user/hadoop/output/part-m-00000 1 2024-06-18 02:08:04 2 2024-06-17 02:08:04 3 2024-06-16 02:08:04 4 2024-06-15 02:08:04 5 2024-06-14 02:08:04
-
-
解決策: タイムスタンプフィールドを含むデータを HDFS にインポートする場合、--direct 引数を削除します。
sqoop import \ --connect jdbc:mysql://rm-2ze****341.mysql.rds.aliyuncs.com:3306/s***o_sqoop_db \ --username s***o \ --password ****** \ --table test_table \ --target-dir /user/hadoop/output \ --delete-target-dir \ --split-by id \ --fields-terminated-by '|' \ -m 1クエリ結果に正しい値が表示されるようになります。
[root@master-1-1(xxx) ~]# hdfs dfs -cat /user/hadoop/output/part-m-00000 1 2024-06-18 10:08:04.0 2 2024-06-17 10:08:04.0 3 2024-06-16 10:08:04.0 4 2024-06-15 10:08:04.0 5 2024-06-14 10:08:04.0