最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

sqoop 實(shí)現(xiàn)將postgresql表導(dǎo)入hive表

 更新時(shí)間:2020年12月31日 09:24:24   作者:空中的魚1987  
這篇文章主要介紹了sqoop 實(shí)現(xiàn)將postgresql表導(dǎo)入hive表,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用sqoop導(dǎo)入數(shù)據(jù)至hive常用語句

直接導(dǎo)入hive表

sqoop import 
--connect jdbc:postgresql://ip/db_name
--username user_name 
--table table_name 
--hive-import -m 5 

內(nèi)部執(zhí)行實(shí)際分三部,1.將數(shù)據(jù)導(dǎo)入hdfs(可在hdfs上找到相應(yīng)目錄),2.創(chuàng)建hive表名相同的表,3,將hdfs上數(shù)據(jù)傳入hive表中

sqoop根據(jù)postgresql表創(chuàng)建hive表

sqoop create-hive-table 
--connect jdbc:postgresql://ip/db_name 
--username user_name 
--table table_name 
--hive-table hive_table_name
( --hive-partition-key partition_name若需要分區(qū)則加入分區(qū)名稱) 

導(dǎo)入hive已經(jīng)創(chuàng)建好的表中

sqoop import 
--connect jdbc:postgresql://ip/db_name 
--username user_name 
--table table_name 
--hive-import -m 5 
--hive-table hive_table_name 
(--hive-partition-key partition_name --hive-partition-value partititon_value);

使用query導(dǎo)入hive表

sqoop import 
--connect jdbc:postgresql://ip/db_name 
--username user_name 
--query "select ,* from retail_tb_order where \$CONDITIONS" 
--hive-import -m 5 
--hive-table hive_table_name 
(--hive-partition-key partition_name --hive-partition-value partititon_value); 

注意:$CONDITIONS條件必須有,query子句若用雙引號,則$CONDITIONS需要使用\轉(zhuǎn)義,若使用單引號,則不需要轉(zhuǎn)義。

遇到問題

若需要在導(dǎo)入hive數(shù)據(jù)表的前提下,再添加在原有關(guān)系型數(shù)據(jù)庫中沒有的一列數(shù)據(jù)如何解決。

首先,我們想到的是添加一個(gè)partition可很方便的添加“一列”數(shù)據(jù),partition的使用很類似普通一列,常用的sql執(zhí)行是沒有問題的。

其次,想到在query的sql中添加一個(gè)常量或者一個(gè)變量,例如:”select 'hello',* from retail_tb_order where \$CONDITIONS“,執(zhí)行后會(huì)報(bào)異常

12/08/28 14:41:31 INFO tool.CodeGenTool: Beginning code generation 
12/08/28 14:41:31 INFO manager.SqlManager: Executing SQL statement: select 'hello',* from retail_tb_order where (1 = 0) 
12/08/28 14:41:32 INFO manager.SqlManager: Executing SQL statement: select 'hello',* from retail_tb_order where (1 = 0) 
12/08/28 14:41:32 ERROR orm.ClassWriter: Cannot resolve SQL type 1111 
12/08/28 14:41:32 ERROR orm.ClassWriter: Cannot resolve SQL type 1111 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR orm.ClassWriter: No Java type for SQL type 1111 for column _column_ 
12/08/28 14:41:32 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.NullPointerException 
java.lang.NullPointerException 
 at org.apache.sqoop.orm.ClassWriter.parseNullVal(ClassWriter.java:900) 
 at org.apache.sqoop.orm.ClassWriter.parseColumn(ClassWriter.java:925) 
 at org.apache.sqoop.orm.ClassWriter.generateParser(ClassWriter.java:999) 
 at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1314) 
 at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1138) 
 at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:82) 
 at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:367) 
 at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:453) 
 at org.apache.sqoop.Sqoop.run(Sqoop.java:145) 
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
 at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181) 
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220) 
 at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229) 
 at org.apache.sqoop.Sqoop.main(Sqoop.java:238) 
 at com.cloudera.sqoop.Sqoop.main(Sqoop.java:57) 

該問題出現(xiàn)原因是sqoop ClassWriter類會(huì)在postgresql表中解析sql中的所有列,當(dāng)解析常量'hello'時(shí),數(shù)據(jù)庫沒有該列也就找不到相應(yīng)的數(shù)據(jù)類型。

若要解決該問題應(yīng)該需修改ClassWriter源碼。

補(bǔ)充:使用Sqoop,最終導(dǎo)入到hive中的數(shù)據(jù)和原數(shù)據(jù)庫中數(shù)據(jù)不一致解決辦法

Sqoop是一款開源的工具,主要用于在Hadoop(Hive)與傳統(tǒng)的數(shù)據(jù)庫(mysql、postgresql...)間進(jìn)行數(shù)據(jù)的傳遞,可以將一個(gè)關(guān)系型數(shù)據(jù)庫(例如 : MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導(dǎo)進(jìn)到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導(dǎo)進(jìn)到關(guān)系型數(shù)據(jù)庫中。

1.問題背景  

使用Sqoop把oracle數(shù)據(jù)庫中的一張表,這里假定為student,當(dāng)中的數(shù)據(jù)導(dǎo)入到hdfs中,然后再創(chuàng)建hive的external表,location到剛才保存到hdfs中數(shù)據(jù)的位置。最后發(fā)現(xiàn)對hive中表特定條件進(jìn)行count時(shí)結(jié)果和oracle中結(jié)果不一致。

1.1 導(dǎo)入數(shù)據(jù)到hdfs中/user/hadoop/student路徑下

sqoop import --connect "jdbc:oracle:thin:@//localhost:1521/student" --password "***" --username "***" --query "select * from student where name='zhangsan' and class_id='003' and \$CONDITIONS" --target-dir "/user/hadoop/student" --verbose -m 1

這個(gè)時(shí)候hdfs上/user/hadoop/student下就保存了從oracle上導(dǎo)入的表數(shù)據(jù)。

表數(shù)據(jù)在hdfs上是如何存儲(chǔ)的呢?注意這一點(diǎn),造成了最后產(chǎn)生結(jié)果不一致的錯(cuò)誤。

我們來看一看在hdfs上數(shù)據(jù)是如何存儲(chǔ)的。我們運(yùn)行hadoop fs -cat /user/hadoop/student/part-m-00000,可以看到原來字段與字段之間都用‘,'分隔開,這是sqoop默認(rèn)的,這時(shí)候,如果一個(gè)字段值當(dāng)中包含‘,',再向hive中插入數(shù)據(jù)時(shí)分隔就會(huì)出錯(cuò)。因?yàn)閔ive也是用‘,'分隔的。

2.分析問題  

對hive中表select count(*) from student的結(jié)果和oracle中select count(*) from studeng的結(jié)果進(jìn)行比較,發(fā)現(xiàn)條數(shù)是一樣的,說明沒有少load數(shù)據(jù)。那為什么對特定條件結(jié)果就會(huì)不一致,而且hive中條數(shù)比oracle中少。也就是同時(shí)運(yùn)行select count(*) from student where class_id='003'

最后,發(fā)現(xiàn)hive用逗號分隔數(shù)據(jù)時(shí),有幾條數(shù)據(jù)字段內(nèi)值包含有逗號,所以字段與值對應(yīng)起來就亂套了,所以得不到正確結(jié)果。

我們建議用‘\001'來進(jìn)行sqoop 導(dǎo)入數(shù)據(jù)時(shí)的 分割。也就是--fields-terminated-by <char>參數(shù)。

參考:http://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html#_large_objects

最后優(yōu)化后的sqoop語句為:

sqoop import --connect "jdbc:oracle:thin:@//localhost:1521/student" --password "***" --username "***" --query "select * from student where name='zhangsan' and class_id='003' and \$CONDITIONS" --target-dir "/user/hadoop/student" --fields-terminated-by "\001" --verbose -m 1

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 聊聊PostgreSql table和磁盤文件的映射關(guān)系

    聊聊PostgreSql table和磁盤文件的映射關(guān)系

    這篇文章主要介紹了聊聊PostgreSql table和磁盤文件的映射關(guān)系,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明

    基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明

    這篇文章主要介紹了基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Postgresql中json和jsonb類型區(qū)別解析

    Postgresql中json和jsonb類型區(qū)別解析

    在我們的業(yè)務(wù)開發(fā)中,可能會(huì)因?yàn)樘厥狻練v史,偷懶,防止表連接】經(jīng)常會(huì)有JSON或者JSONArray類的數(shù)據(jù)存儲(chǔ)到某列中,這個(gè)時(shí)候再PG數(shù)據(jù)庫中有兩種數(shù)據(jù)格式可以直接一對多或者一對一的映射對象,接下來通過本文介紹Postgresql中json和jsonb類型區(qū)別,需要的朋友可以參考下
    2024-06-06
  • 使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù)

    使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù)

    這篇文章主要介紹了使用Postgresql 實(shí)現(xiàn)快速插入測試數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL時(shí)間日期的語法及注意事項(xiàng)

    PostgreSQL時(shí)間日期的語法及注意事項(xiàng)

    在開發(fā)過程中,經(jīng)常要取日期的年,月,日,小時(shí)等值,PostgreSQL 提供一個(gè)非常便利的EXTRACT函數(shù),這篇文章主要給大家介紹了關(guān)于PostgreSQL時(shí)間日期的語法及注意事項(xiàng)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 解決PostgreSQL 執(zhí)行超時(shí)的情況

    解決PostgreSQL 執(zhí)行超時(shí)的情況

    這篇文章主要介紹了解決PostgreSQL 執(zhí)行超時(shí)的情況,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 關(guān)于PostgreSQL截取某個(gè)字段中的部分內(nèi)容進(jìn)行排序的問題

    關(guān)于PostgreSQL截取某個(gè)字段中的部分內(nèi)容進(jìn)行排序的問題

    這篇文章主要介紹了PostgreSQL截取某個(gè)字段中的部分內(nèi)容進(jìn)行排序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • postgresql 實(shí)現(xiàn)將字段為空的值替換為指定值

    postgresql 實(shí)現(xiàn)將字段為空的值替換為指定值

    這篇文章主要介紹了postgresql 實(shí)現(xiàn)將字段為空的值替換為指定值,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 實(shí)現(xiàn)列轉(zhuǎn)行問題

    PostgreSQL 實(shí)現(xiàn)列轉(zhuǎn)行問題

    這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)列轉(zhuǎn)行問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Postgresql開啟遠(yuǎn)程訪問的步驟全紀(jì)錄

    Postgresql開啟遠(yuǎn)程訪問的步驟全紀(jì)錄

    postgre一般默認(rèn)為本地連接,不支持遠(yuǎn)程訪問,所以如果要開啟遠(yuǎn)程訪問,需要更改安裝文件的配置。下面這篇文章主要給大家介紹了關(guān)于Postgresql開啟遠(yuǎn)程訪問的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-03-03

最新評論

武乡县| 青海省| 贵定县| 瓮安县| 桦甸市| 清镇市| 平南县| 平邑县| 蒙城县| 巴林左旗| 蓝田县| 鱼台县| 弋阳县| 通辽市| 安顺市| 西和县| 会宁县| 县级市| 湘潭县| 东平县| 雷州市| 西乌| 宜章县| 保山市| 安福县| 萝北县| 兰州市| 阳江市| 牟定县| 乌恰县| 上虞市| 丹棱县| 长白| 习水县| 金坛市| 兴业县| 获嘉县| 大竹县| 安塞县| 饶阳县| 石门县|