Pyspark:查询自身数据框以创建新列
Pyspark : Query self dataframe to create a new column
我在 pyspark 中有以下数据集
Id
Sub
1
Mat
1
Phy
1
Sci
2
Bio
2
Phy
2
Sci
我想创建一个类似于下面的 df
Id
Sub
HaMat
1
Mat
1
1
Phy
1
1
Sci
1
2
Bio
0
2
Phy
0
2
Sci
0
我如何在 pyspark 中执行此操作?
def hasMath(studentID,df):
return df.filter(col('Id') == studentID & col('sub') = 'Mat' ).count()
df = df.withColumn("hasMath",hasMath(F.col('id'),df1))
但这似乎不起作用。有没有更好的方法来实现这个。
您可以在 window 和 expr
(对于 Spark 2.4+)上使用 collect_list
来获取每个 ID
的主题列表并过滤 Mat
.
size
函数获取数组的计数。
from pyspark.sql import functions as F
from pyspark.sql.functions import col
from pyspark.sql.window import Window
w = Window().partitionBy("Id")
df.withColumn("list", F.collect_list(col("Sub")).over(w))\
.withColumn("hasMath", F.size(F.expr("filter(list, x -> x == 'Mat')")))\
.drop("list").show()
输出:
+---+---+-------+
| Id|Sub|hasMath|
+---+---+-------+
| 1|Phy| 1|
| 1|Mat| 1|
| 1|Sci| 1|
| 2|Phy| 0|
| 2|Bio| 0|
| 2|Sci| 0|
+---+---+-------+
我在 pyspark 中有以下数据集
Id | Sub |
---|---|
1 | Mat |
1 | Phy |
1 | Sci |
2 | Bio |
2 | Phy |
2 | Sci |
我想创建一个类似于下面的 df
Id | Sub | HaMat |
---|---|---|
1 | Mat | 1 |
1 | Phy | 1 |
1 | Sci | 1 |
2 | Bio | 0 |
2 | Phy | 0 |
2 | Sci | 0 |
我如何在 pyspark 中执行此操作?
def hasMath(studentID,df):
return df.filter(col('Id') == studentID & col('sub') = 'Mat' ).count()
df = df.withColumn("hasMath",hasMath(F.col('id'),df1))
但这似乎不起作用。有没有更好的方法来实现这个。
您可以在 window 和 expr
(对于 Spark 2.4+)上使用 collect_list
来获取每个 ID
的主题列表并过滤 Mat
.
size
函数获取数组的计数。
from pyspark.sql import functions as F
from pyspark.sql.functions import col
from pyspark.sql.window import Window
w = Window().partitionBy("Id")
df.withColumn("list", F.collect_list(col("Sub")).over(w))\
.withColumn("hasMath", F.size(F.expr("filter(list, x -> x == 'Mat')")))\
.drop("list").show()
输出:
+---+---+-------+
| Id|Sub|hasMath|
+---+---+-------+
| 1|Phy| 1|
| 1|Mat| 1|
| 1|Sci| 1|
| 2|Phy| 0|
| 2|Bio| 0|
| 2|Sci| 0|
+---+---+-------+