在pyspark数据框中显示不同的列值:python

在pyspark数据框中显示不同的列值:python,pyspark,pyspark-sql,Pyspark,Pyspark Sql,请为Pandasdf['col'].unique()推荐pyspark数据帧替代方案 我想列出pyspark dataframe列中的所有唯一值 不是SQL类型的方式(registertemplate然后SQL查询不同的值) 另外,我不需要groupby->countDistinct,而是要检查该列中的不同值。假设我们正在使用以下数据表示形式(两列,k和v,其中k包含三个条目,两个唯一: +---+---+ | k| v| +---+---+ |foo| 1| |bar| 2| |foo

请为Pandas
df['col'].unique()推荐pyspark数据帧替代方案

我想列出pyspark dataframe列中的所有唯一值

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


另外,我不需要
groupby->countDistinct
,而是要检查该列中的不同值。

假设我们正在使用以下数据表示形式(两列,
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()
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
这将返回一个
ndarray
,即
数组(['foo','bar',dtype=object)

您要求提供“pyspark数据帧替代品,用于熊猫df['col'].unique()”。现在,给出以下Spark数据帧:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()
s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
如果您想从Spark获得相同的结果,即
ndarray
,请使用
toPandas()

或者,如果您不特别需要
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\u set可以帮助从给定的pyspark.sql.DataFrame列中获取唯一值
df.select(F.collect\u set(“column”).alias(“column”)).first()[“column”]

除了选项之外,还有我们在中所知道的方法:

drop\u 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|
+---+---+
如果要选择所有(列)数据作为数据帧(df)中的不同FRM,则

df.select('*').distinct().show(10,truncate=False)
您可以这样做

distinct_列='somecol'
distinct\u column\u vals=df.select(distinct\u column.distinct().collect())
distinct_column_VAL=[v[distinct_column]表示v在distinct_column_VAL中]
首先运行此命令

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\u count.desc()).show()

Hi-eddies,最后一行代码distinct().map()对我不起作用。错误:AttributeError:“DataFrame”对象没有属性“map”。我在spark 2.0上。至于toPandas,我不会说它是一个替代方案,它先将spark DataFrame转换为pandas DataFrame,然后再对其执行pandas操作。您好,satya。只需在
distinct()之后添加一个
.rdd
调用来更新答案
。Spark 1.6.2中没有这个功能,但我刚刚确认,编辑后的答案在Spark 2.0.0中也可以使用。为什么要尝试通过转换为pandas数据帧来避免Spark数据帧操作(如果它太大,会造成伤害)或者在spark数据帧完全能够做到这一点的情况下利用rdd操作?请参见下面的答案@Pabbati@Laurens上述答案中有三种解决方案,这取决于发帖人真正想要什么。在所有情况下,发帖人都想要某种形式的不同值列表/数组(c.f.poster对seufagner答案的回应).上面的第三个解决方案确实使用了Spark的dataframe api,正如Pabbati的回答一样,但实际上根据海报的要求返回了一个列表。是的,问题标题包括“show”一词。但海报明确指出,看到结果是不够的,需要一个列表。如上所述,请参阅海报对seufagner答案的评论。@seufagner是的,我可以使用df.dropDuplices(['col1'])来查看(标记see)唯一值,但不需要收集(to_rdd或to pandas df然后df['col'])。unique(),我无法获取唯一值列表。感谢您的建议。用户没有询问如何显示非重复值。他只是想获取所有唯一/不同项的列表,其中也包括重复项!此代码返回不可编辑的数据,即,我看到不同的数据位无法在代码中迭代。是否有其他方法可以启用我尝试使用toPandas()将其转换为Pandas df,然后获取具有唯一值的iterable。但是,遇到“Pandas not found”错误message@Abhi:代替.show()执行.collect()操作,这样您将获得该特定列的所有不同值的iterable。但请确保您的主节点有足够的内存来保存这些唯一值,因为collect会将所有请求的数据(在本例中为列的唯一值)推送到主节点:)@Satya我已将您的注释编辑到答案中,谢谢