python – PySpark Boolean Pivot
发布时间:2020-12-20 11:05:28 所属栏目:Python 来源:网络整理
导读:我有一些模仿以下结构的数据: rdd = sc.parallelize( [ (0,1),(0,5),3),(1,2),(2,6) ])df_data = sqlContext.createDataFrame(rdd,["group","value"])df_data.show()+-----+-----+|group|value|+-----+-----+| 0| 1|| 0| 5|| 0| 3|| 1| 2|| 1| 3|| 2| 6|+--
我有一些模仿以下结构的数据:
rdd = sc.parallelize( [ (0,1),(0,5),3),(1,2),(2,6) ] ) df_data = sqlContext.createDataFrame(rdd,["group","value"]) df_data.show() +-----+-----+ |group|value| +-----+-----+ | 0| 1| | 0| 5| | 0| 3| | 1| 2| | 1| 3| | 2| 6| +-----+-----+ 我想要做的是按组旋转这些数据,以显示“值”值的存在,如下所示: +-----+-------+-------+-------+-------+-------+ |group|value_1|value_2|value_3|value_5|value_6| +-----+-------+-------+-------+-------+-------+ | 0| true| false| true| true| false| | 1| false| true| true| false| false| | 2| false| false| false| false| true| +-----+-------+-------+-------+-------+-------+ 有什么方法可以用PySpark实现这个目标吗? 我尝试过groupby / pivot / agg的组合而没有任何成功. 解决方法
@Psidom’s answer仅适用于Spark版本2.3及更高版本,因为pyspark.sql.DataFrameNaFunctions在先前版本中不支持bool.
这是我在Spark 2.1中运行该代码时得到的结果: import pyspark.sql.functions as F (df_data.withColumn('value',F.concat(F.lit('value_'),df_data.value)) .groupBy('group').pivot('value').agg(F.count('*').isNotNull()) .na.fill(False).show()) #+-----+-------+-------+-------+-------+-------+ #|group|value_1|value_2|value_3|value_5|value_6| #+-----+-------+-------+-------+-------+-------+ #| 0| true| null| true| true| null| #| 1| null| true| true| null| null| #| 2| null| null| null| null| true| #+-----+-------+-------+-------+-------+-------+ 这是一个适用于Spark 2.2及更低版本的替代解决方案: # first pivot and fill nulls with 0 df = df_data.groupBy('group').pivot('value').count().na.fill(0) df.show() #+-----+---+---+---+---+---+ #|group| 1| 2| 3| 5| 6| #+-----+---+---+---+---+---+ #| 0| 1| 0| 1| 1| 0| #| 1| 0| 1| 1| 0| 0| #| 2| 0| 0| 0| 0| 1| #+-----+---+---+---+---+---+ 现在使用select重命名列并将值从int转换为bool: df.select( *[F.col(c) if c == 'group' else F.col(c).cast('boolean').alias('value_'+c) for c in df.columns] ).show() +-----+-------+-------+-------+-------+-------+ |group|value_1|value_2|value_3|value_5|value_6| +-----+-------+-------+-------+-------+-------+ | 0| true| false| true| true| false| | 1| false| true| true| false| false| | 2| false| false| false| false| true| +-----+-------+-------+-------+-------+-------+ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |