pyspark udf returnType=ArrayType中是不同数据类型

方法一:使用udf

 

df = hc.createDataFrame([[1,[1,2,3]],[2,[2,3,4]],[3,[3,4,5]]],['id','list'])

schema=StructType(
    [StructField('id', IntegerType(), True),
    StructField('list', ArrayType(IntegerType()), True)]
)
@F.udf(returnType=schema)
def func(_id, _list):
    return [_id, _list]
df2 = df.withColumn('id_list', func('id', 'list'))

方法二:使用map也能实现 

 

def map_func(x):
    v = (x['id'], x['list'])
    return Row(
        id = x.id,
        list = x.list,
        id_list = v
    )
df_ = df.rdd.map(lambda x : map_func(x)).toDF()
df_.show(truncate=False)

然后id_list collect_list之后还能按照第一个位置的元素进行排序

 

df3 = df2.groupby().agg(
    F.collect_list('id_list').alias('id_lists')
)
df3.show(truncate=False)

@F.udf(returnType=ArrayType(ArrayType(IntegerType())))
def fc(id_lists):
    id_lists.sort(key = lambda x : x[0], reverse=True)
    return [x[1] for x in id_lists]
df4 = df3.withColumn('lists', fc('id_lists'))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值