1. 程式人生 > >Hive-實戰記錄2

Hive-實戰記錄2

Hive-實戰記錄2

兩週的在Hive上進行資料的操作,發現實際上的操作程式碼邏輯和Mysql的程式碼基本相同,唯有一些不同是,Hive不支援一個單獨的資料元進行修改,但是可以新增行和列。另外,除了用最簡單的insert進行寫入外,可以用指令碼的方式寫入新的資料,和表格。
這次記錄一下,一些實際過程中使用的的“笨辦法”和遇到的一些和naive的Bug,以及解決放方法。

首先是在處理埋點工作時,遇到的一些問題。在json格式中,希望將其中的key和key的順序,在新建的兩個欄位中顯示出。由於dict中是沒有index的,所以使用了指令碼對資料進行修改:
使用指令碼方法1:

ADD
FILE path/'demo.py-2018-12-22';

將指令碼上傳到當前路徑下,

select
transform(json_string)
using 'demo.py-2018-12-22'
as json, json_key, key_index
from tmp_table

這裡,在Hive上的表格檔案,設定為csv格式的逗號分隔符,之後用python對用逗號分隔的string進行處理,抓取key和對應的index。
附上一部分python的指令碼:

for line in sys.stdin:
    line = line.split()#.decode('utf-8')
temp_list_all.append(line) #這裡將每行的資料加入temp_list_all中
def get_key_from_string(str_info):
    string_json = str(str_info)
    dict_json = eval(string_json)#eval()函式會把string格式變為有效的資料結構。
    key_list = dict_json.get_keys()#得到所有的keys
    #之後對keys進行index
    key_index = []
    for i in range(0,len(
key_list)): key_index.append(i) return key_list, key_index

這個指令碼只能處理完全符合json格式的string字串,其中會遇到包括雙引號單引號矛盾等等的問題,很多情況下不能用eval()函式去進行處理的時候,就需要很蠢得根據具體情況,對string字串進行逐字的處理。
由於指令碼是直接在遠端終端跑的,最後指令碼中代替原本insert功能的就是python的print,以下為例子:

for i in range(0,len(key_list)):
    key = key_list[i]
    index = key_index[i]
    print('\t'.join([key,index]))

除了這一種比較笨的辦法使用指令碼去處理資料之外,還有用dfs的方式去直接建立一個新的table

dfs -get hdfs:path/sample.csv sample.csv;
ADD FILE sample.csv;
use data_base;
drop table data_base.sample_table;
create table data_base.sample_table
(
      --element in sample.csv datatype
)
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
'field.delim'=',',
'serialization.format'=',')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
load data local inpath 'sample.csv' overwrite into table data_base.sample_table

這裡要注意欄位的維度和datatype必須和insert的表格資料一致。
除了這兩種資料匯入方式之外,有些很少的內容,在指令碼內寫邏輯修改可能很麻煩,那麼就能用最簡單的case when來修改資料。比如:

drop table if exists data_base.tmp_key_index;
CREATE table data_base.tmp_key_index as
select 
json,key_name,
case 
when (json= '{a:1,b:2,c:3}' and key_name= 'a') then 0
when (json= '{a:1,b:2,c:3}' and key_name= 'b') then 1
when (json= '{a:1,b:2,c:3}' and key_name= 'c') then 2
as key_index
from data_base.sample_table

python有很強大的功能,並且語法簡單,功能用例很多,在處理資料時,可以提供不少的幫助。

感覺Hive沒有太多技術上會讓人迷茫的地方,都可以在網上搜到,所以以後沒有大的需求,不再做更多的記錄了。