# 有一个给定的list
col_search = [u'人脸',u'自拍',u'风景',u'室内',u'室外']
#有一个数据集data,包含两个字段id,tag 其中tag是一个ArrayType()型 例如:
id | tag
011 | ['儿童',‘人脸’,'室内']
012 | ['女性',‘男性’,'自拍']
#使用explode函数将tag拓展开,即list转成dataframe的行数据
data1 = data.withColumn("tag",explode("tag"))
#这时候data1就变成了如下格式:
id | tag
011 | '儿童'
011 | '人脸'
011 | '室内'
012 | '女性'
012 | '男性'
012 | '自拍'
#下面我们要判断tag中的每一行是否出现在col_search中,如果没出现则返回[0,0,0,0,0],出现的话则将出现的位置标1,这里我们使用spark上的自定义函数udf来实现
def Contain_col(p):
#5是给定搜索list的长度,在我们这里,就是上面的col_search的长度
lista = [0]*5
if p in col_search:
idloc = col_search.index(p)
lista[idloc] = 1
return lista
udf_Contain_col = udf(lambda x:Contain_col(x),ArrayType(IntegerType()))
#通过上面的udf定义,我们就可以搜索元素,并将搜索的结果做为一个变量生成到dataframe中
data2 = data1.withColumn("concol",udf_Contain_col(data1["tag"]))
#此时数据的结果如下:
id | tag | concol
011 | '儿童' | [0,0,0,0,0]
011 | '人脸' | [1,0,0,0,0]
011 | '室内' | [0,0,0,1,0]
012 | '女性' | [0,0,0,0,0]
012 | '男性' | [0,0,0,0,0]
012 | '自拍' | [0,1,0,0,0]
#最后将concol列拆分成多列
data3 = data2.select([data2.id,data2.tag] + [data2.concol[i] for i in range[5]])
#此时数据的结果如下:
id | tag | concol[0] | concol[1] | concol[2] | concol[3] | concol[4]
011 | '儿童' | 0 | 0 | 0 | 0 | 0
011 | '人脸' | 1 | 0 | 0 | 0 | 0
011 | '室内' | 0 | 0 | 0 | 1 | 0
012 | '女性' | 0 | 0 | 0 | 0 | 0
012 | '男性' | 0 | 0 | 0 | 0 | 0
012 | '自拍' | 0 | 1 | 0 | 0 | 0
#最后根据需要可进行合并求和或求count
今天就分享这个例子,如有任何问题可以加群R语言&大数据分析456726635或者Python & Spark大数636866908与我联系。