python - PySpark 布尔枢轴
问题描述
我有一些模仿以下结构的数据:
rdd = sc.parallelize(
[
(0,1),
(0,5),
(0,3),
(1,2),
(1,3),
(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 的答案仅适用于 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
to 转换为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|
+-----+-------+-------+-------+-------+-------+
推荐阅读
- linux - 如何找到每个节点(分支)的树的最大深度
- java - 我无法在硒中找到元素
- c++ - 特定数据类型的模板类
- python - 重塑/填充 Numpy 数组 - Python
- python - 格式化数据集的问题
- jquery - ReferenceError: $ 未在 webpack 4 中定义
- c++ - 提供与 TMP 和 SFINAE 的通用接口
- javascript - 如何从 expressjs 的响应中捕获前端的错误?
- django - 使用 Gunicorn 和 Nginx 设置 Django 服务器
- java - Android 如何知道特定视图在特定布局中可以具有哪些属性?