Sqoop 同步数据到mysql, Can't parse input data: '\N'
?Sqoop 同步數據到mysql
?
Sqoop? 從hdfs 同步數據到mysql 是我們常常遇到的事情
同步分為 分區表同步和非分區表同步
需要注意以下幾點
1. hive 中的表 必須是textfile ,不能是有parquet 等壓縮方式的
2.hive 表如果是分區表,需要每次只能同步一個分區的數據到 mysql,
如果hive 有多個分區,只能寫多個腳本,或者多個循環調度,或者將多分區表落地成一個非分區的臨時表,進行同步
hive也可以同步分區表過去,只不過hive一次只能同步一個分區,hive 是文件形式的啊 ?分區也只是目錄文件,你一次只能指定一個目錄 ?不能一下子指定多個目錄
3.對于mysql來說 ?只是把數據(mysql不會在意這數據怎么來的)插到表里 ? 表是分區就按分區字段插 ?不是分區就直接插
4.hive 推送到mysql 的時候,并不需要字段 名字對應一致,只要字段個數一致,但是數據類型必須一致,否則會出現,且分區的那個字段 在hive 中是偽列,推送的時候 在mysql 中不能有。 \N 的錯誤
5、sqoop會將 hive 表中空值轉換為\N? ,如果MySQL這個字段是 int ?double ?肯定存儲不了\N,會報空值錯誤。
6、mysql 中 int ?double 等要注意hive 的字符長度。
下面寫法可以
create table dm.tmp_ae_mid_payback_detail_new as?
select * from dm.ae_mid_payback_detail_new
sqoop export -D mapred.child.java.opts="-Djava.security.egd=file:/dev/../dev/urandom" \
? --connect "jdbc:/app?useUnicode=true&characterEncoding=utf8" \
? --username "dr" \
? --password "yyyy" \
? --input-null-string '\\N' ?--input-null-non-string '\\N' \
? --table amque_mid_payback_detail_new \
? --export-dir /user/hive/warehouse/dm/dm_ae_mid_payback_detail_new \
? --input-fields-terminated-by '\001' \
?
這個也可以,只不過只能推送一個分區,和偽列不可以推送
sqoop export -D mapred.child.java.opts="-Djava.security.egd=file:/dev/../dev/urandom" \
? --connect "jdbc:/app?useUnicode=true&characterEncoding=utf8" \
? --username "dr" \
? --password "yyyy" \
? --input-null-string '\\N' ?--input-null-non-string '\\N' \
? --table amque_mid_payback_detail_new \
? --export-dir /user/hive/warehouse/dm/amque_mid_payback_detail_new/partition_month='2018-11' \
? --input-fields-terminated-by '\001' \
總結
以上是生活随笔為你收集整理的Sqoop 同步数据到mysql, Can't parse input data: '\N'的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hive 在kettle 作业retu
- 下一篇: hive 和 impala 时间参数错