使用 pyspark 数据框,您如何做相当于 Pandas df['col'].unique()
的操作。
我想列出 pyspark 数据框列中的所有唯一值。
不是 SQL 类型的方式(registertemplate 然后 SQL 查询不同的值)。
此外,我不需要 groupby
和 countDistinct
,而是要检查该列中的不同 VALUES。
这应该有助于获得列的不同值:
df.select('column1').distinct().collect()
请注意,.collect()
对可以返回的值的数量没有任何内置限制,因此这可能会很慢 - 请改用 .show()
或在 .collect()
之前添加 .limit(20)
来管理它。
假设我们正在使用以下数据表示形式(两列,k
和 v
,其中 k
包含三个条目,两个是唯一的:
+---+---+
| k| v|
+---+---+
|foo| 1|
|bar| 2|
|foo| 3|
+---+---+
使用 Pandas 数据框:
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)
您要求提供“pandas 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
,而只需要列 k
的唯一值的列表:
s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()
最后,您还可以使用列表推导,如下所示:
[i.k for i in s_df.select('k').distinct().collect()]
distinct()
之后添加 .rdd
调用更新了答案。它在 Spark 1.6.2 中没有它,但我刚刚确认编辑的答案也适用于 Spark 2.0.0。
您可以使用 df.dropDuplicates(['col1','col2'])
根据数组中的 colX 仅获取不同的行。
如果您想查看数据框中特定列的不同值,您只需要编写以下代码。它将显示 df
数据框中的 colname
列的 100 个不同值(如果有 100 个值可用)。
df.select('colname').distinct().show(100, False)
如果您想对不同的值做一些花哨的事情,可以将不同的值保存在向量中:
a = df.select('colname').distinct()
collect_set
有助于从 pyspark.sql.DataFrame
的给定列中获取唯一值:
df.select(F.collect_set("column").alias("column")).first()["column"]
collect_set
,但我认为以下内容会更简洁:df.agg(F.collect_set("column")).collect()[0][0]
你可以做
distinct_column = 'somecol'
distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]
除了 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|
+---+---+
如果您想选择 ALL(columns) 数据作为与 DataFrame (df) 不同的数据,则
df.select('*').distinct().show(10,truncate=False)
先运行这个
df.createOrReplaceTempView('df')
然后运行
spark.sql("""
SELECT distinct
column name
FROM
df
""").show()
让我们假设您的原始 DataFrame 称为 df
。然后,您可以使用:
df1 = df.groupBy('column_1').agg(F.count('column_1').alias('trip_count'))
df2 = df1.sort(df1.trip_count.desc()).show()
Row
对象,您需要使用类似以下答案的列表推导:stackoverflow.com/a/60896261/7465462