1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Hive SQL使用過程中的奇怪現(xiàn)象

        共 4080字,需瀏覽 9分鐘

         ·

        2020-09-15 13:59


        hive是基于Hadoop的一個(gè)數(shù)據(jù)倉(cāng)庫工具,用來進(jìn)行數(shù)據(jù)的ETL,這是一種可以存儲(chǔ)、查詢和分析存儲(chǔ)在Hadoop中的大規(guī)模數(shù)據(jù)的機(jī)制。hive能將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供SQL查詢功能。Hive SQL是一種類SQL語言,與關(guān)系型數(shù)據(jù)庫所支持的SQL語法存在微小的差異。本文對(duì)比MySQL和Hive所支持的SQL語法,發(fā)現(xiàn)相同的SQL語句在Hive和MySQL中輸出結(jié)果的會(huì)有所不同。

        兩個(gè)整數(shù)除

        除法是SQL引擎難以解釋的算術(shù)運(yùn)算。如果將兩個(gè)整數(shù)相加,相減或相乘,則始終會(huì)得到一個(gè)整數(shù)。值得注意的是,如果將兩個(gè)整數(shù)相除,不同的SQL查詢引擎輸出的結(jié)果不盡相同。在Hive和MySQL中,運(yùn)算兩個(gè)整數(shù)相除,輸出的結(jié)果都是decimal類型。

        --?Hive中查詢
        select?10/3???????--?輸出:3.3333333333333335
        --?在MySQL中查詢
        select?10/3???????--?輸出:3.3333

        如果使用下面的方式,則會(huì)返回整形類型

        --?Hive中查詢
        select?10?div?3???????--?輸出:3
        --?在MySQL中查詢
        select?10?div?3???????--?輸出:3

        區(qū)分大小寫

        當(dāng)我們比較兩個(gè)字符串時(shí),在不同的SQL引擎會(huì)產(chǎn)生不同的結(jié)果。需要注意的是,在字符串比較中,Apache Hive是區(qū)分大小寫,看下面的例子。

        --?Hive中查詢
        select?'Bigdata'?=?'bigdata'???--?輸出false
        --?在MySQL中查詢
        select?'Bigdata'?=?'bigdata'??--?輸出1

        可以看出:相同的SQL語句,如果使用MySQL,則同一查詢將返回1,因?yàn)樵谶M(jìn)行字符串比較時(shí)MySQL不區(qū)分大小寫。這意味著只要它們具有相同的字母,MySQL便會(huì)將兩個(gè)字符串解釋為相同的字符串。

        我們?cè)賮砜匆幌铝硗庖粋€(gè)現(xiàn)象,當(dāng)我們把表名寫成大寫的,會(huì)出現(xiàn)什么現(xiàn)象呢?

        這取決于所使用的SQL引擎,在引用數(shù)據(jù)庫中的表時(shí)需要注意區(qū)分大小寫。如果使用Hive,則在引用表時(shí)無需擔(dān)心大小寫,因?yàn)樗鼈兪冀K將字母轉(zhuǎn)換為小寫字母。但是在MySQL中會(huì)報(bào)1146 - Table 'XX' doesn't exist的錯(cuò)誤。

        --?假設(shè)Hive、MySQL中有一張test表
        --?在Hive中查詢
        select?*?from?Test???--?正常輸出結(jié)果
        --?在MySQL中查詢
        select?*?from?Test???--?報(bào)錯(cuò):1146 - Table 'Test' doesn't exist

        在GROUP BY中使用別名

        假設(shè)有如下查詢:

        --?使用別名,在Hive中查詢
        --?報(bào)錯(cuò)Error?while?compiling?statement:?FAILED:?SemanticException?[Error?10004]:?line?7:9?Invalid?table?alias?or?column?reference?'inventory_status':?(possible?column?names?are:?userid,?visitdate,?visitcount)
        SELECT?CASE
        ???????????WHEN?visicount?>?5?THEN?"more?than?5"
        ???????????ELSE?"less?than?5"
        ???????END?AS?inventory_status,
        ???????count(*)?AS?cnt
        FROM?test
        GROUP?BY?inventory_status

        --?不使用別名,如果使用下面的語句,則會(huì)正常輸出結(jié)果
        SELECT?CASE
        ???????????WHEN?visitcount?>?5?THEN?"more?than?5"
        ???????????ELSE?"less?than?5"
        ???????END?AS?inventory_status,
        ???????count(*)?AS?cnt
        FROM?test
        GROUP?BY?CASE
        ???????????WHEN?visitcount?>?5?THEN?"more?than?5"
        ???????????ELSE?"less?than?5"
        ???????END

        相同的查詢語句在MySQL中進(jìn)行查詢,會(huì)正常輸出結(jié)果。

        非數(shù)值類型的字符串轉(zhuǎn)為數(shù)值類型

        使用SQL,我們可以使用CAST命令轉(zhuǎn)換表中列的數(shù)據(jù)類型。如果要將字符串列轉(zhuǎn)換為整數(shù),可以執(zhí)行以下操作。

        SELECT?CAST(column_name?AS?INT)?FROM?table_name

        那么,如果我們將一個(gè)非數(shù)值類型的字符串轉(zhuǎn)為數(shù)值類型,會(huì)出現(xiàn)什么樣的結(jié)果呢?

        --?在Hive中查詢
        select?cast("bigdata"?as?int)?--?返回null
        --?在MySQL中查詢
        select?cast("bigdata"?as?signed?int)??--?返回0

        Hive中的視圖與SQL查詢語句

        當(dāng)我們?cè)贖ive中創(chuàng)建視圖時(shí),其底層是將視圖對(duì)應(yīng)的SQL語句存儲(chǔ)到了一張表中的某個(gè)字段中,以Hive為例,其元數(shù)據(jù)中存在下面的一張表:

        CREATE?TABLE?`TBLS`?(
        ??`TBL_ID`?bigint(20)?NOT?NULL,
        ??`CREATE_TIME`?int(11)?NOT?NULL,
        ??`DB_ID`?bigint(20)?DEFAULT?NULL,
        ??`LAST_ACCESS_TIME`?int(11)?NOT?NULL,
        ??`OWNER`?varchar(767)?CHARACTER?SET?latin1?COLLATE?latin1_bin?DEFAULT?NULL,
        ??`OWNER_TYPE`?varchar(10)?CHARACTER?SET?latin1?COLLATE?latin1_bin?DEFAULT?NULL,
        ??`RETENTION`?int(11)?NOT?NULL,
        ??`SD_ID`?bigint(20)?DEFAULT?NULL,
        ??`TBL_NAME`?varchar(128)?CHARACTER?SET?latin1?COLLATE?latin1_bin?DEFAULT?NULL,
        ??`TBL_TYPE`?varchar(128)?CHARACTER?SET?latin1?COLLATE?latin1_bin?DEFAULT?NULL,
        ??`VIEW_EXPANDED_TEXT`?mediumtext?CHARACTER?SET?utf8,
        ??`VIEW_ORIGINAL_TEXT`?mediumtext?CHARACTER?SET?utf8,
        ??`LINK_TARGET_ID`?bigint(20)?DEFAULT?NULL,
        ??PRIMARY?KEY?(`TBL_ID`),
        ??UNIQUE?KEY?`UNIQUETABLE`?(`TBL_NAME`,`DB_ID`),
        ??KEY?`TBLS_N50`?(`SD_ID`),
        ??KEY?`TBLS_N49`?(`DB_ID`),
        ??KEY?`TBLS_N51`?(`LINK_TARGET_ID`),
        ??CONSTRAINT?`TBLS_FK1`?FOREIGN?KEY?(`SD_ID`)?REFERENCES?`SDS`?(`SD_ID`),
        ??CONSTRAINT?`TBLS_FK2`?FOREIGN?KEY?(`DB_ID`)?REFERENCES?`DBS`?(`DB_ID`),
        ??CONSTRAINT?`TBLS_FK3`?FOREIGN?KEY?(`LINK_TARGET_ID`)?REFERENCES?`TBLS`?(`TBL_ID`)
        )?ENGINE=InnoDB?DEFAULT?CHARSET=latin1;

        上面的這張表存儲(chǔ)了Hive中表和視圖的元數(shù)據(jù)信息,如果創(chuàng)建一張視圖,則VIEW_EXPANDED_TEXT字段與 VIEW_ORIGINAL_TEXT字段存儲(chǔ)了視圖對(duì)應(yīng)的SQL語句。

        當(dāng)我們使用下面的SQL語句創(chuàng)建視圖或者直接執(zhí)行時(shí),可能會(huì)出現(xiàn)不一樣的結(jié)果:

        create?view?as?select?*?from?test?where?name?like?"%大數(shù)據(jù)"

        如果是直接執(zhí)行SQL語句,則會(huì)按照條件篩選出想要的結(jié)果。但是,如果是創(chuàng)建視圖,則可能不會(huì)出現(xiàn)想要的結(jié)果。上面提到,視圖對(duì)應(yīng)的SQL語句是作為一個(gè)字段存儲(chǔ)到Hive的元數(shù)據(jù)中的,對(duì)應(yīng)其中的一張表。如上面的SQL語句,**like "%大數(shù)據(jù)"**中包含中文,該中文字符會(huì)出現(xiàn)亂碼現(xiàn)象,即存儲(chǔ)到表中時(shí)會(huì)變成下面的形式:

        create?view?as?select?*?from?test?where?name?like?"???"

        解決上面的問題很簡(jiǎn)單,只需要修改元數(shù)據(jù)中該字段的編碼即可:

        ALTER?TABLE?`TBLS`?MODIFY?COLUMN?VIEW_EXPANDED_TEXT?mediumtext?CHARACTER?SET?utf8;
        ALTER?TABLE?`TBLS`?MODIFY?COLUMN?VIEW_ORIGINAL_TEXT?mediumtext?CHARACTER?SET?utf8;

        總結(jié)

        本文分享了Hive使用過程中存在的一些問題,并給出了相對(duì)應(yīng)的示例,我們?cè)谑褂玫倪^程中可以留意一下這些問題,對(duì)比相同的SQL語句在MySQL和Apache Hive上的結(jié)果上的不同。

        瀏覽 68
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产日韩欧美中文在线播放 | 国产精品久久久久久久久久懂色 | 打白嫩光屁股调教拍击, | 日本大学生黄色片 | 国产高清绿奴videos | 男女啪视频 | 女s的女m女女系列vk | 国产午夜精品理论片a大结局 | 亚洲AV无码成人精品区麻豆曹妞 | 91精品国产综合久久久久久3u8 |