请为Pandas建议pyspark数据框替代方案df['col'].unique()
。
我想在pyspark dataframe列中列出所有唯一值。
不是SQL类型的方式(先注册模板,然后通过SQL查询不同的值)。
另外,我不需要groupby->countDistinct
,相反,我想检查该列中的不同值。
Answers:
假设我们正在使用以下数据表示形式(两列,k
和v
,其中k
包含三个条目,两个唯一):
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
|foo| 3|
+---+---+
使用熊猫数据框:
import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()
这将返回ndarray
,即array(['foo', 'bar'], dtype=object)
您要求提供“用于df ['col']。unique()的pyspark数据框替代”。现在,给定以下Spark数据帧:
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
如果您希望通过Spark获得相同的结果,即使用ndarray
,请使用toPandas()
:
s_df.toPandas()['k'].unique()
另外,如果您不需要ndarray
专门的列,而只需要column的唯一值的列表k
:
s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()
最后,您还可以使用列表推导,如下所示:
[i.k for i in s_df.select('k').distinct().collect()]
.rdd
呼叫来更新答案distinct()
。它在Spark 1.6.2中没有此功能,但我只是确认编辑后的答案在Spark 2.0.0中也适用。
这应该有助于获取列的不同值:
df.select('column1').distinct().collect()
请注意,.collect()
返回的值没有内置的限制,因此这可能很慢-.show()
改用或先添加.limit(20)
后再.collect()
进行管理。
collect_set可以帮助从pyspark.sql.DataFrame的给定列获取唯一值
df.select(F.collect_set("column").alias("column")).first()["column"]
如果要选择所有(列)数据作为DataFrame(df)的不同数据,则
df.select('*').distinct().show(10,truncate=False)
除了该dropDuplicates
选项外,还有一个我们所知道的命名方法:pandas
drop_duplicates
drop_duplicates()是一个别名dropDuplicates() 。
例
s_df = sqlContext.createDataFrame([("foo", 1),
("foo", 1),
("bar", 2),
("foo", 3)], ('k', 'v'))
s_df.show()
+---+---+
| k| v|
+---+---+
|foo| 1|
|foo| 1|
|bar| 2|
|foo| 3|
+---+---+
按子集删除
s_df.drop_duplicates(subset = ['k']).show()
+---+---+
| k| v|
+---+---+
|bar| 2|
|foo| 1|
+---+---+
s_df.drop_duplicates().show()
+---+---+
| k| v|
+---+---+
|bar| 2|
|foo| 3|
|foo| 1|
+---+---+