创建上图所示dataframe,供下面举例使用
1.注册 可在sql中运行
from pyspark.sql.types import *
def pow1(m,n):
return float(m)**float(n)
udf = spark.udf
udf.register('pow1',pow1,returnType=DoubleType())
#将dataframe注册成临时表A
df.createOrReplaceTempView('A')
print(spark.sql('select pow1(id,2) from A').show())
print(spark.sql('select pow1(id,3) from A').show())
2.可在dataframe中新增列使用
from pyspark.sql.functions import lit, udf
def pow2(m,n):
return float(m)**float(n)+4
pow2=udf(pow2)
df2=df.withColumn("id_", pow2("id","id"))
print(df2.show())
3.map 中使用的Python普通函数
def pow3(m):
return float(m)**float(m)
rdd=df.rdd.map(lambda x:(pow3(x['id']),x['id'],x['tag'],x['value']))
print(rdd.collect())
df3=spark.createDataFrame(rdd,['id_','id','tag','value'])
print(df3.show())
4.transform 调用python环境sql运行
import sys
import datetime
for line in sys.stdin:
#获取每一行的内容并去掉头尾的空格
line = line.strip()
#根据换行符截取对应的字段
movie,rate,timeinfo,userid = line.split('\t')
#将timeinfo转成时间格式
weekday = datetime.datetime.fromtimestamp(float(timeinfo)).isoweekday()
#重新拼接拼接新的内容并加入换行符
print '\t'.join([movie, rate, str(weekday),userid])
insert into table lastjsontable
select transform(movie,rate,unixtime,userid)
using 'python datechange.py' as(movie,rate,weekday,userid)
from rate;
Hive的Transform的实现 - 薄点 - 博客园