ODS(Operational Data Store):原始數據層,存放原始數據,直接加載原始日志、數據,數據保持原貌不做處理。
在ODS一般需要2個重要的步驟,示例如下:
1.建立ODS層的Hive表。
drop table if exists ods_start_log; CREATE EXTERNAL TABLE ods_start_log (`line` string) PARTITIONED BY (`dt` string) STORED AS INPUTFORMAT 'com.hadoop.mapred.DeprecatedLzoTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/warehouse/gmall/ods/ods_start_log';
重要說明:
①ODS層存放的是原始數據,因此只需要一個字段就行。
②ODS層的數據來源於HDFS,里面存儲的文件帶有壓縮,因此需要指明相應的壓縮方式。Hive的LZO壓縮參考https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LZO。
③在多人操作一張Hive表時,最好建立外部表,防止刪表時將其中的數據也刪掉了。
④幾乎所有數倉的表,都是分區表,每天一個區。
⑤LOCATION只是指明此項目的數據放在那里統一管理,與內外部表沒有關系。
2 編寫將數據導入上述表中的腳本。
#!/bin/bash APP=gmall hive=/opt/module/hive/bin/hive if [ -n $1 ] ;then do_date=$1 else do_date=date -d "-1 day" +%F fi sql=" load data inpath '/origin_data/gmall/log/topic_start/$do_date' into table "$APP".ods_start_log partition(dt='$do_date'); load data inpath '/origin_data/gmall/log/topic_event/$do_date' into table "$APP".ods_event_log partition(dt='$do_date'); " $hive -e "$sql"
重要說明:
①-n是為了判斷有沒有這個參數
②數倉一般需要導入前一天的數據,因此在日期處理上需要減一天,同時進行格式化。
③表名前需要加上庫名,否則會去默認的default庫里找。
④hive -e可以直接執行sql。