【发布时间】:2019-04-09 14:21:06
【问题描述】:
我有一个这样的数据框
data = [(("ID1", "A", 1)), (("ID1", "B", 5)), (("ID2", "A", 12)),
(("ID3", "A", 3)), (("ID3", "B", 3)), (("ID3", "C", 5)), (("ID4", "A", 10))]
df = spark.createDataFrame(data, ["ID", "Type", "Value"])
df.show()
+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID1| A| 1|
|ID1| B| 5|
|ID2| A| 12|
|ID3| A| 3|
|ID3| B| 3|
|ID3| C| 5|
|ID4| A| 10|
+---+----+-----+
我只想提取那些只包含一个特定类型 - “A”的行(或 ID)
因此我的预期输出将包含以下行
+---+----+-----+
| ID|Type|Value|
+---+----+-----+
|ID2| A| 1|
|ID4| A| 10|
+---+----+-----+
对于每个 ID 可以包含任何类型 - A、B、C 等。我想提取那些包含一个且仅一个类型的 ID - 'A'
如何在 PySpark 中实现这一点
【问题讨论】:
-
添加 group count column 并过滤计数等于 1 的位置。
-
这应该是 -
from pyspark.sql.functions import col, when, collect_list, array_contains, size, first然后df = df.groupby(['ID']).agg(first(col('Type')).alias('Type'),first(col('Value')).alias('Value'),collect_list('Type').alias('Type_Arr')) -
df = df.where(array_contains(col('Type_Arr'),'A') & (size(col('Type_Arr'))==1)).drop('Type_Arr') -
@cph_sto: 你的回答是正确的,能不能请你写这个作为回答,我会接受的
-
@Hardikgupta 刚刚做了,稍作修改以解决一个
ID下多个As的问题。
标签: python apache-spark pyspark apache-spark-sql