• 随机抽样

有的时候我们需要从一张大表中随机抽取一定量的样本供分析,Hive中提供了一个rand()函数,我们就利用这个来实现随机抽样。

思路如下:

对于表中每行均附加一个随机的整数,然后再以该整数进行orderBy即可得。

例如下面这个

   
   
   
   
  1. select vt.user_nick, vt.vidx from ( 
  2.     select user_nick, cast(rand() * 100000 as intas vidx 
  3.     from s_mc_xcard_user where pt='20120808000000' 
  4.     order by vidx limit 10000 
  5. ) vt order by vt.vidx limit 100 

 

  • 处理复杂的数据结构

如果我们希望将复杂的数据结构存储在Hive表中,可以使用Json字符串这种东东来承载。Hive中提供了一个get_json_object的函数供json解析;这个函数里面的第二个参数比较令人费解,不过官方文档还算是清楚。

另外hive还提供了array,struct, map等数据结构,貌似目前功能很少,不建议使用。

 

  • 行列转置

比如有一张这样的表:

uid int mydata array
100 'a','b','c'
101 'a','c'

 

其中data字段是一个array类型(可由split函数得到)。

我们希望得到下面这样的结果:

'a' 2
'b' 1
'c' 2

其中,第二个字段的含义是各个data的分量出现的次数。

在Hive中,这种能生成了新的行函数被称作UDTF,这里我们可以使用explode+lateral view来达到目的。

   
   
   
   
  1. SELECT onedata, count(1) FROM tbl LATERAL VIEW explode(mydata) 
  2. vdata AS onedata; 


-----