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

解決sqoop import 導(dǎo)入到hive后數(shù)據(jù)量變多的問題

 更新時間:2020年12月31日 09:32:55   作者:lee_moonj  
這篇文章主要介紹了解決sqoop import 導(dǎo)入到hive后數(shù)據(jù)量變多的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

使用sqoop import 命令從postgresql導(dǎo)入數(shù)據(jù)到hive中,發(fā)現(xiàn)數(shù)據(jù)行數(shù)變多了,但是任務(wù)沒有跑錯,非常奇怪。

導(dǎo)入語句為:

sqoop import 
--connect jdbc:postgresql://*.*.*.*:5432/database_name 
--username name111 
--password password111 
--table table111 
--hive-import 
--hive-database database111 
--hive-table hive_table111 
--hive-overwrite 
--delete-target-dir 
--hive-drop-import-delims 
--null-string ''
 --null-non-string '' 
 -m5

導(dǎo)入前pgsql數(shù)據(jù)量為3698條,但是導(dǎo)入后再hive中的數(shù)據(jù)量為3938,數(shù)據(jù)竟然變多了。最后發(fā)現(xiàn)將參數(shù)-m5,改為-m1即可解決問題。

為什么呢?

我們先來了解一下參數(shù)-m的含義以及sqoop導(dǎo)入的原理。

首先用戶輸入一個 Sqoop import 命令,Sqoop 會從關(guān)系型數(shù)據(jù)庫中獲取元數(shù)據(jù)信息,比如要操作數(shù)據(jù)庫表的 schema是什么樣子,這個表有哪些字段,這些字段都是什么數(shù)據(jù)類型等。它獲取這些信息之后,會將輸入命令轉(zhuǎn)化為基于 Map 的 MapReduce作業(yè),這樣 MapReduce作業(yè)中有很多 Map 任務(wù),每個 Map 任務(wù)從數(shù)據(jù)庫中讀取一片數(shù)據(jù),這樣多個 Map 任務(wù)實現(xiàn)并發(fā)的拷貝,把整個數(shù)據(jù)快速的拷貝到 HDFS 上。

而決定切分成多少個map就是參數(shù)-m的作用,-m5代表切分為5個map,-m1代表切分為1個map,即不用切分。

而決定用什么字段來切分,就是用--split-by來制定的。當(dāng)sqoop import 沒有定義--split-by時,默認使用源數(shù)據(jù)表的key作為切分字段。

split-by 根據(jù)不同的參數(shù)類型有不同的切分方法,如int型,Sqoop會取最大和最小split-by字段值,然后根據(jù)傳入的num-mappers來 確定劃分幾個區(qū)域。比如select max(split_by),min(split-by) from得到的max(split-by)和min(split-by)分別為1000和1,而num-mappers(-m)為2的話,則會分成兩個區(qū)域 (1,500)和(501-1000),同時也會分成2個sql給2個map去進行導(dǎo)入操作,分別為select XXX from table where split-by>=1 and split-by<500和select XXX from table where split-by>=501 and split-by<=1000.最后每個map各自獲取各自SQL中的數(shù)據(jù)進行導(dǎo)入工作。

那回到最開始的問題,為什么切分數(shù)目不一樣,結(jié)果就不一樣呢?理論上無論怎么切分,導(dǎo)入的數(shù)據(jù)都應(yīng)該是一樣的,但現(xiàn)在甚至還多了?這是因為,用來切分的字段不友好,不是int型或者有排序規(guī)律的。

這種id內(nèi)容是沒有排序規(guī)則的,比如本來10條id切兩份得到(5,5),現(xiàn)在切出來時(5,6),有一個id重復(fù)了,就導(dǎo)致數(shù)量變多了。

所以解決辦法有兩個:

一是將 -m5 改成 -m1 直接不切分;

二是 --split-by制定另外的字段,換一個int型的或者有明確排序順序的字段。

除了以上這種原因?qū)е聰?shù)據(jù)變多,語句缺少 --hive-drop-import-delims 也可能導(dǎo)致問題的出現(xiàn),解決如下:

關(guān)于在sqoop導(dǎo)入數(shù)據(jù)的時候,數(shù)據(jù)量變多的解決方案。

今天使用sqoop導(dǎo)入一張表,我去查數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)量為650條數(shù)據(jù),但是我將數(shù)據(jù)導(dǎo)入到hive表當(dāng)中的時候出現(xiàn)了563條數(shù)據(jù),這就很奇怪了,我以為是數(shù)據(jù)錯了,然后多導(dǎo)入了幾次數(shù)據(jù)發(fā)現(xiàn)還是一樣的問題。

然后我去查數(shù)據(jù)字段ID的值然后發(fā)現(xiàn)建了主鍵的數(shù)據(jù)怎么可能為空的那。然后我去看數(shù)據(jù)庫當(dāng)中的數(shù)據(jù)發(fā)現(xiàn),數(shù)據(jù)在存入的時候不知道加入了什么鬼東西,導(dǎo)致數(shù)據(jù)從哪一行截斷了,導(dǎo)致多出現(xiàn)了三條數(shù)據(jù)。下面是有問題的字段。

這里我也不知道數(shù)據(jù)為啥會是這樣,我猜想是在導(dǎo)入數(shù)據(jù)的時候hive默認行的分割符號是按照\n的形式導(dǎo)入進來的,到這里遇到了這樣的字符就對其按照下一行進行對待將數(shù)據(jù)截斷了。

然后我測試了一直自定義的去指定hive的行的分割符號,使用--lines-terminated-by 指定hive的行的分割符號,但是不幸的是好像這個是不能改的。他會報下面的錯誤:

FAILED: SemanticException 1:424 LINES TERMINATED BY only supports newline '\n' right now. Error encountered near token ''\164'' 于是上網(wǎng)找資料,然后發(fā)現(xiàn)可以使用一個配置清除掉hive當(dāng)中默認的分割符號,然后導(dǎo)入數(shù)據(jù),配置如下: --hive-drop-import-delims 這個參數(shù)是去掉hive默認的分割符號,加上這個參數(shù)然后在使用--fields-terminated-by 指定hive的行的分割符號 最終數(shù)據(jù)導(dǎo)入成功,數(shù)據(jù)量和原來數(shù)庫當(dāng)中的數(shù)據(jù)一致。

上面是sqoop腳本的部分內(nèi)容,下面是執(zhí)行完hive之后,hive創(chuàng)建的表,字段之間默認的分割符號。

至此問題得到了解決。

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

相關(guān)文章

  • 解決postgreSql遠程連接數(shù)據(jù)庫超時的問題

    解決postgreSql遠程連接數(shù)據(jù)庫超時的問題

    這篇文章主要介紹了解決postgreSql遠程連接數(shù)據(jù)庫超時的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL設(shè)置時間自動更新的示例代碼

    PostgreSQL設(shè)置時間自動更新的示例代碼

    在我們?nèi)粘i_發(fā)中,在設(shè)計數(shù)據(jù)庫字段的時候不可避免的都要created_time以及updated_time兩個時間戳字段,作用大家也都一目了然,下面將為大家詳細介紹PostgreSQL設(shè)置時間自動更新的方法,需要的朋友可以參考下
    2025-03-03
  • PostgreSQL之連接失敗的問題及解決

    PostgreSQL之連接失敗的問題及解決

    這篇文章主要介紹了PostgreSQL之連接失敗的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • postgresql rank() over, dense_rank(), row_number()用法區(qū)別

    postgresql rank() over, dense_rank(), row_number()用法區(qū)別

    這篇文章主要介紹了postgresql rank() over, dense_rank(), row_number()的用法區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL創(chuàng)建新用戶所遇見的權(quán)限問題以及解決辦法

    PostgreSQL創(chuàng)建新用戶所遇見的權(quán)限問題以及解決辦法

    這篇文章主要給大家介紹了關(guān)于PostgreSQL創(chuàng)建新用戶所遇見的權(quán)限問題以及解決辦法, 在PostgreSQL中創(chuàng)建一個新用戶非常簡單,但可能會遇到權(quán)限問題,需要的朋友可以參考下
    2023-09-09
  • postgresql 索引之 hash的使用詳解

    postgresql 索引之 hash的使用詳解

    這篇文章主要介紹了postgresql 索引之 hash的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • postgresql中的ctid解讀

    postgresql中的ctid解讀

    這篇文章主要介紹了postgresql中的ctid使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 如何為PostgreSQL的表自動添加分區(qū)

    如何為PostgreSQL的表自動添加分區(qū)

    這篇文章主要介紹了如何為PostgreSQL的表自動添加分區(qū),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • postgreSQL自動生成隨機數(shù)值的實例

    postgreSQL自動生成隨機數(shù)值的實例

    這篇文章主要介紹了postgreSQL自動生成隨機數(shù)值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL進行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作代碼

    PostgreSQL進行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作代碼

    在數(shù)據(jù)庫管理中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是非常常見的操作,特別是在 PostgreSQL 中,提供了多種工具和方法來實現(xiàn)數(shù)據(jù)的有效管理,本文將詳細介紹在 PostgreSQL 中如何進行數(shù)據(jù)導(dǎo)入和導(dǎo)出,并給出具體的命令及示例,需要的朋友可以參考下
    2024-10-10

最新評論

思茅市| 福海县| 泊头市| 蒙阴县| 万源市| 合江县| 波密县| 元氏县| 黄骅市| 收藏| 达尔| 浪卡子县| 上蔡县| 胶南市| 桂东县| 铅山县| 安仁县| 嵊州市| 平潭县| 利津县| 南宫市| 昭通市| 苍溪县| 阳山县| 嵊州市| 杂多县| 鱼台县| 永泰县| 萨迦县| 桑植县| 盖州市| 习水县| 肇东市| 宜兰市| 城口县| 崇义县| 新巴尔虎左旗| 登封市| 石楼县| 株洲县| 子长县|