python通过hive transform处理数据

[python]  view plain  copy
  1. 自己写的一个简单例子,用来做话题描述去重,表中的desc字段 “a-b-a-b-b-c”需要去重    
  2. python代码如下:    
  3. #!/usr/bin/python    
  4. import sys    
  5. reload(sys)    
  6. sys.setdefaultencoding('utf8')    
  7. def quchong(desc):    
  8.     a=desc.split('-')    
  9.     return '-'.join(set(a))    
  10. while True:    
  11.         line = sys.stdin.readline()    
  12.         if line == "":    
  13.                 break    
  14.         line = line.rstrip('\n')    
  15.         # your process code here    
  16.         parts = line.split('\t')    
  17.         parts[2]=quchong(parts[2])    
  18.         print "\t".join(parts)    
  19.     
  20. 下面是转载过来的,比较详细    
  21. 二、hive map中字段自增的写法(转)    
  22.     
  23. 1、建立表结构    
  24.     
  25. hive> CREATE TABLE t3 (foo STRING, bar MAP<STRING,INT>)    
  26.     > ROW FORMAT DELIMITED    
  27.     > FIELDS TERMINATED BY '/t'    
  28.     > COLLECTION ITEMS TERMINATED BY ','    
  29.     > MAP KEYS TERMINATED BY ':'    
  30.     > STORED AS TEXTFILE;    
  31. OK    
  32.     
  33.      
  34.     
  35. 2、建成的效果    
  36.     
  37. hive> describe t3;    
  38. OK    
  39. foo     string    
  40. bar     map<string,int>    
  41.     
  42.      
  43.     
  44. 3、生成test.txt    
  45.     
  46. jeffgeng        click:13,uid:15    
  47.     
  48.      
  49.     
  50. 4、把test.txt load进来    
  51.     
  52. hive> LOAD DATA LOCAL INPATH 'test.txt' OVERWRITE INTO TABLE t3;    
  53. Copying data from file:/root/src/hadoop/hadoop-0.20.2/contrib/hive-0.5.0-bin/bin/test.txt    
  54. Loading data to table t3    
  55. OK    
  56.     
  57.      
  58.     
  59. load完效果如下    
  60.     
  61. hive> select * from t3;    
  62. OK    
  63. jeffgeng        {"click":13,"uid":15}    
  64.     
  65.      
  66.     
  67. 5、可以这样查map的值    
  68.     
  69. hive> select bar['click'from t3;    
  70.     
  71. ...一系列的mapreduce...    
  72.     
  73. OK    
  74. 13    
  75.     
  76.      
  77.     
  78. 6、编写add_mapper    
  79.     
  80. #!/usr/bin/python    
  81. import sys    
  82. import datetime    
  83.     
  84. for line in sys.stdin:    
  85.     line = line.strip()    
  86.     foo, bar = line.split('/t')    
  87.     d = eval(bar)    
  88.     d['click'] += 1    
  89.     print '/t'.join([foo, str(d)])    
  90.     
  91.      
  92.     
  93. 7、在hive中执行    
  94.     
  95. hive> CREATE TABLE t4 (foo STRING, bar MAP<STRING,INT>)    
  96.     > ROW FORMAT DELIMITED    
  97.     > FIELDS TERMINATED BY '/t'    
  98.     > COLLECTION ITEMS TERMINATED BY ','    
  99.     > MAP KEYS TERMINATED BY ':'    
  100.     > STORED AS TEXTFILE;    
  101.     
  102.      
  103.     
  104. hive> add FILE add_mapper.py    
  105.     
  106.      
  107.     
  108. INSERT OVERWRITE TABLE t4    
  109.     > SELECT    
  110.     >   TRANSFORM (foo, bar)    
  111.     >   USING 'python add_mapper.py'    
  112.     >   AS (foo, bar)    
  113.     > FROM t3;    
  114. FAILED: Error in semantic analysis: line 1:23 Cannot insert into target table because column number/types are different t4: Cannot convert column 1 from string to map<string,int>.    
  115.     
  116.      
  117.     
  118. 8、为什么会报出以上错误?貌似add_mapper.py的输出是string格式的,hive无法此这种格式的map认出。后查明,AS后边可以为字段强制指定类型    
  119.     
  120. INSERT OVERWRITE TABLE t4    
  121. SELECT    
  122.   TRANSFORM (foo, bar)    
  123.   USING 'python add_mapper.py'    
  124.   AS (foo string, bar map<string,int>)    
  125. FROM t3;    
  126.     
  127.      
  128.     
  129. 9、同时python脚本要去除字典转换后遗留下来的空格,引号,左右花排号等    
  130.     
  131. #!/usr/bin/python    
  132. import sys    
  133. import datetime    
  134.     
  135. for line in sys.stdin:    
  136.     line = line.strip('/t')    
  137.     foo, bar = line.split('/t')    
  138.     d = eval(bar)    
  139.     d['click'] += 1    
  140.     d['uid'] += 1    
  141.     strmap = ''    
  142.     for x in str(d):    
  143.         if x in (' '"'"):    
  144.             continue    
  145.         strmap += x    
  146.     print '/t'.join([foo, strmap])    
  147.     
  148.      
  149.     
  150. 10、执行后的结果    
  151.     
  152. hive> select * from t4;    
  153. OK    
  154. jeffgeng        {"click":14,"uid":null}    
  155. Time taken: 0.146 seconds   
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值