在pyspark dataframe中显示不同的列值:python

Sat*_*tya 65 pyspark pyspark-sql

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

我想列出pyspark数据帧列中的所有唯一值.

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

我也不需要groupby->countDistinct,而是想检查该列中的不同VALUES.

小智 141

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

df.select('column1').distinct().show()
Run Code Online (Sandbox Code Playgroud)

  • 这是一个单行,您想要更多的格式? (39认同)
  • 要获取 Python **实际值列表**而不是 `Row` 对象,您需要使用列表理解,如以下答案所示:/sf/answers/4262738301/ (3认同)
  • @Abhi:代替.show()而是执行.collect(),那样您将获得该特定列的所有不同值的可迭代值。但是请确保您的主节点有足够的内存来保留这些唯一值,因为collect会将所有请求的数据(在这种情况下,列的唯一值)推送到主节点:) (2认同)
  • `pyspark_df.select(target_column_name).distinct().toPandas()[target_column_name].to_list()` 将给出一个平面 Python 列表。 (2认同)

edd*_*ies 67

让我们假设我们正在使用以下数据表示(两列,k并且v,其中k包含三个条目,两个唯一:

+---+---+
|  k|  v|
+---+---+
|foo|  1|
|bar|  2|
|foo|  3|
+---+---+
Run Code Online (Sandbox Code Playgroud)

使用Pandas数据帧:

import pandas as pd
p_df = pd.DataFrame([("foo", 1), ("bar", 2), ("foo", 3)], columns=("k", "v"))
p_df['k'].unique()
Run Code Online (Sandbox Code Playgroud)

这返回一个ndarray,即array(['foo', 'bar'], dtype=object)

您要求为pandas df ['col']提供"pyspark数据帧替代方案.exclusive()".现在,给出以下Spark数据帧:

s_df = sqlContext.createDataFrame([("foo", 1), ("bar", 2), ("foo", 3)], ('k', 'v'))
Run Code Online (Sandbox Code Playgroud)

如果你想从Spark 获得相同的结果,即ndarray使用toPandas():

s_df.toPandas()['k'].unique()
Run Code Online (Sandbox Code Playgroud)

或者,如果您不需要ndarray专门的,只需要列的唯一值列表k:

s_df.select('k').distinct().rdd.map(lambda r: r[0]).collect()
Run Code Online (Sandbox Code Playgroud)

最后,您还可以使用列表推导如下:

[i.k for i in s_df.select('k').distinct().collect()]
Run Code Online (Sandbox Code Playgroud)

  • 嗨,涡流,最后一行代码distinct().map()对我不起作用。错误:AttributeError:“DataFrame”对象没有属性“map”。我正在使用 Spark 2.0。至于 Pandas 的事情,我不会说它是一种替代方案,它首先将 Spark 数据帧转换为 pandas 数据帧,然后对其进行 pandas 操作。 (2认同)
  • 嗨萨蒂亚。刚刚通过在“distinct()”之后添加“.rdd”调用来更新答案。在 Spark 1.6.2 中没有它也可以工作,但我刚刚确认编辑后的答案也可以在 Spark 2.0.0 中工作。 (2认同)
  • 当Spark数据帧完全有能力做到这一点时,为什么要尝试通过转换为Pandas数据帧(如果硕大无比)或使用rdd操作来避免Spark数据帧操作呢?见下面@Pabbati的答案 (2认同)
  • 是的,问题标题包含“显示”一词。但发帖者特别澄清,仅看到结果还不够,需要一个列表。如上所述,请参阅发帖人对 seufagner 答案的评论。 (2认同)

Nid*_*dhi 20

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

df.select('colname').distinct().show(100, False)
Run Code Online (Sandbox Code Playgroud)

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

a = df.select('colname').distinct()
Run Code Online (Sandbox Code Playgroud)


seu*_*ner 12

您可以使用df.dropDuplicates(['col1','col2'])基于阵列中的colX仅获取不同的行.

  • @seufagner是,我可以执行df.dropDuplictes(['col1'])来查看(标记SEE)唯一值,但是没有collect(to_rdd或熊猫DF,然后是df ['col']。unique()) ,我无法获得唯一值列表。感谢您的建议。 (2认同)

muo*_*uon 12

你可以做

distinct_column = 'somecol' 

distinct_column_vals = df.select(distinct_column).distinct().collect()
distinct_column_vals = [v[distinct_column] for v in distinct_column_vals]
Run Code Online (Sandbox Code Playgroud)


Har*_*kar 8

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]``` (4认同)