在pyspark数据框中显示不同的列值:python
请为Pandas在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
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我已将您的注释编辑到答案中,谢谢