dataframe - pyspark中有没有一种方法可以计算唯一值

标签 dataframe apache-spark pyspark apache-spark-sql

我有一个 spark 数据框 (12m x 132),我正在尝试按列计算唯一值的数量,并删除只有 1 个唯一值的列。

到目前为止,我已经使用了 pandas nunique 函数:

import pandas as pd

df = sql_dw.read_table(<table>)
df_p = df.toPandas()

nun = df_p.nunique(axis=0)
nundf = pd.DataFrame({'atr':nun.index, 'countU':nun.values})

dropped = []
for i, j in nundf.values:
  if j == 1:
    dropped.append(i)
    df = df.drop(i)
print(dropped)

有没有一种更适合 spark 的方法 - 即不使用 pandas?

最佳答案

请查看下面的注释示例。该解决方案需要更多 python 作为 pyspark 特定知识。

import pyspark.sql.functions as F
#creating a dataframe
columns = ['asin' ,'ctx' ,'fo' ]

l = [('ASIN1','CTX1','FO1')
,('ASIN1','CTX1','FO1')
,('ASIN1','CTX1','FO2')
,('ASIN1','CTX2','FO1')
,('ASIN1','CTX2','FO2')
,('ASIN1','CTX2','FO2')
,('ASIN1','CTX2','FO3')
,('ASIN1','CTX3','FO1')
,('ASIN1','CTX3','FO3')]

df=spark.createDataFrame(l, columns)

df.show()
#we create a list of functions we want to apply
#in this case countDistinct for each column
expr = [F.countDistinct(c).alias(c) for c in df.columns]

#we apply those functions
countdf =  df.select(*expr)
#this df has just one row
countdf.show()

#we extract the columns which have just one value
cols2drop = [k for k,v in countdf.collect()[0].asDict().items() if v == 1]
df.drop(*cols2drop).show()

输出:

+-----+----+---+
| asin| ctx| fo|
+-----+----+---+
|ASIN1|CTX1|FO1|
|ASIN1|CTX1|FO1|
|ASIN1|CTX1|FO2|
|ASIN1|CTX2|FO1|
|ASIN1|CTX2|FO2|
|ASIN1|CTX2|FO2|
|ASIN1|CTX2|FO3|
|ASIN1|CTX3|FO1|
|ASIN1|CTX3|FO3|
+-----+----+---+

+----+---+---+
|asin|ctx| fo|
+----+---+---+
|   1|  3|  3|
+----+---+---+

+----+---+
| ctx| fo|
+----+---+
|CTX1|FO1|
|CTX1|FO1|
|CTX1|FO2|
|CTX2|FO1|
|CTX2|FO2|
|CTX2|FO2|
|CTX2|FO3|
|CTX3|FO1|
|CTX3|FO3|
+----+---+

关于dataframe - pyspark中有没有一种方法可以计算唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772374/

相关文章:

python - 从 Pandas 数据框中的组内选择特定行

pandas - 查找与 pandas 数据框中的某个特征相关的行的第一次出现

python - Pandas:使用 np.where() 删除值小于今天的行?

xml - Pyspark:hdfs 中没有这样的文件或目录

apache-spark - Pyspark 按顺序将多个 csv 文件读取到数据框中

使用 Stratio 的 Spark-MongoDB 库的 MongoDB 查询过滤器

R - 组合 R 中数据帧内的重复行 :

scala - Spark 2.2.0 - 加载特定的文件列表

java - Bluemix Spark 与 Java

apache-spark - Spark : cast decimal without changing nullable property of column