在火花数据框中显示不同的列值

使用 pypark 数据框架,你如何做相当于熊猫 df['col'].unique()

我想列出所有独特的值在一个火花数据框架列。

而不是 SQL 类型方式(registertemplate 然后 SQL 查询不同的值)。

我也不需要 groupby然后 countDistinct,相反,我想检查不同的价值观在该列。

420280 次浏览

假设我们使用以下数据表示形式(两列,kv,其中 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)

您要求为大熊猫提供一个“ pypark 数据框架的替代方案 df [‘ col’] . only ()”,现在,给出以下 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()]

可以使用 df.dropDuplicates(['col1','col2'])根据数组中的 colX 仅获取不同的行。

这将有助于获得列的不同值:

df.select('column1').distinct().collect()

请注意,.collect()对返回的值数量没有任何内置限制,因此这可能会比较慢——使用 .show()或者在 .collect()之前添加 .limit(20)来管理这一点。

collect_set可以帮助从给定的 pyspark.sql.DataFrame列中获得唯一的值:

df.select(F.collect_set("column").alias("column")).first()["column"]

除了 dropDuplicates选项之外,还有一个我们在 pandas drop_duplicates中知道的方法:

Drop _ copy () ()的别名。

例子

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|
+---+---+

如果要选择与 DataFrame (df)不同的 ALL (列)数据,则

df.select('*').distinct().show(10,truncate=False)

你可以的

distinct_column = 'somecol'


distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]

先运行这个

df.createOrReplaceTempView('df')

那就快跑

spark.sql("""
SELECT distinct
column name
FROM
df
""").show()

如果希望在数据框中看到特定列的不同值,只需编写以下代码即可。它将显示 df数据框中 colname列的100个不同值(如果有100个值可用)。

df.select('colname').distinct().show(100, False)

如果你想对不同的值做一些特别的事情,你可以把不同的值保存在一个向量中:

a = df.select('colname').distinct()

让我们假设您的原始数据框架名为 df,然后,您可以使用:

df1 = df.groupBy('column_1').agg(F.count('column_1').alias('trip_count'))
df2 = df1.sort(df1.trip_count.desc()).show()

与其他答案类似,但问题似乎不希望返回 Row 对象,而是希望返回实际值。

理想的俏皮话是 df.select('column').distinct().collect().toPandas().column.to_list() 假设运行. Collection ()对于内存来说不会太大。

我建议首先使用 df.select('column').distinct().count()来估计尺寸,并确保它不会太大。