Skip to content

[Hadoop] HIVE #9

Description

@WarrenLo

HIVE 第一課 : 沒有人會在Hive裡面下 INSERT 命令

為什麼呢?
讓我們繼續看下去...


HIVE 語法 = SQL 語法

CREATE TABLE

  • 在HIVE裡 CREATE TABLE ,會直接在 HDFS 裡面,建立一個與table名稱一樣的資料夾

INSERT INTO

  • 在table 裡面 INSERT INTO 一筆資料

    這時候有沒有發現 insert 的非常久?
    去泡個咖啡再回來,發現終於 insert 完成
    讓我們看看 table 資料夾裡面發生了什麼事情吧

  1. 先輸入 hdfs dfs -ls [資料夾位置]

  2. 會發現裡面儲存了一個 000000_0 的檔案

  3. 哦! 所以 table 裡面的每一筆資料,都是同名資料夾裡的一個檔案

    剛剛所講的方式,會產生內部資料表(Internal Table)。
    有內部就會有外部 (External Table) 。
    這兩種資料表的差異等一下會提到。


所以為什麼沒有人會在HIVE裡面下 INSERT 命令 ?

因為每一筆資料都是一個檔案

Insert N 筆資料,就會有 N 個檔案啊!!!


那應該要怎麼建立資料呢?

  • 在 HDFS 裡面,put 檔案到 table 的資料夾裡面

  • hdfs dfs -put [檔案] [table資料夾路徑]

    可是這樣好麻煩,要一直在 HIVE 跟 HDFS 之間跳來跳去的
    (這樣不是跟方唐鏡一樣討厭了嗎? 我跳進去啦 我又跳出來啦 揍我啊笨蛋!)

    所以我們可不可以在HDFS下面把資料拿出來,丟進HIVE裡,然後在同時建立 table 呢?

    可以的!
    就讓我們開始吧

更方便的建立資料 (External Table)

  1. 在 HDFS 建立一個資料夾
    hdfs dfs -mkdir [資料夾名稱]

  2. 把資料放進建立好的資料夾
    hdfs dfs -put [檔案位置] [資料夾名稱]

  3. 建立一個.hive檔案
    nano [name].hive

    • 檔案內容 :
      CREATE EXTERNAL TABLE zipcode ( cname STRING, dname STRING, zcode STRING )
      ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
      STORED AS TEXTFILE LOCATION '/user/dsa101/tw.zipcode';
    • Internal Table --> /user/dsa101/hive --> 內部資料表才會產生000000_0檔案
    • External Table --> /dataset/ --> 外部資料表的來源是原來的檔案
  4. 直接在HDFS裡,執行.hive檔
    hive -S -f [.hive檔名稱]

    • -f : SQL from files
  5. 查看
    hive -S -e "show tables"

    • -e : SQL from command line

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions