Hive-实战记录2

版权声明:转载需注释。 https://blog.csdn.net/qq_40266296/article/details/85231728

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没有太多技术上会让人迷茫的地方,都可以在网上搜到,所以以后没有大的需求,不再做更多的记录了。

猜你喜欢

转载自blog.csdn.net/qq_40266296/article/details/85231728