加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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|
+-----+-------+-------+-------+-------+-------+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读