天天看点

python将一行作为字段_hivepython 实现一行转多行

案例1:

==效果等同于一行转多行

数据表名称:zhangb.gid_tags

数据格式,每行是2个字段,(gid,tags) ,可能有脏数据,分隔符为“\t”,

ANDROID-9de77225cadb4319adfc1b1fe51c54f0 h65010000,014200,018100,011300,0200

ANDROID-9de77dfdbbab42679eed11f4e48c0ffc 022000,026400,022400,016400,018100

要统计tags中每个tag出现的次数:使用hive python方法:

第一步:写python处理脚本:脚本名字:hivepython.py

import sys

for line in sys.stdin:

appArray=line.strip( ).split("\t")

if len(appArray)==2:

gid=appArray[0]

tags=appArray[1].split(",")

for tag in tags:

print tag

脚本输出是1个字段 tag

第二步,将python脚本加进hive 中:

add file /home/zhangb/hivepython.py

第三步:运行hive语句:

select b.* from (

select a.counter_attr as tag,count(1) as tag_count from (

select TRANSFORM(gid,usertags) USING 'python hivepython.py' as counter_attr from zhangb.gid_tags) a

group by a.counter_attr) b

sort by b.tag;

案例2:

案例1是python处理后输出了1个字段,下面是输出多个字段的形式:

【参考:http://www.cnblogs.com/Joe-T/p/4643452.html】

Hive中有一表,列分隔符为冒号(:),有一列utime是Timestamp格式,需要转成Weekday存到新表。

利用Python写一个Pipeline的Transform,weekday.py的代码也很简单:

import sys

import datetime

for line in sys.stdin:

line=line.strip()

uid,mid,rating,utime=line.split(':')

weekday=datetime.datetime.fromtimestamp(float(utime)).isoweekday()

print '\t'.join([uid,mid,rating,str(weekday)])

HQL的查询也很简单:

select

transform(uid,mid,rating,utime)

using 'python weekday.py' as (uid,mid,rating,weekday)

from rating