Dataframe pyspark中是否有计算唯一值的方法

Dataframe pyspark中是否有计算唯一值的方法,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我有一个spark数据帧(12m x 132),我试图按列计算唯一值的数量,并删除只有一个唯一值的列 到目前为止,我使用了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}) d

我有一个spark数据帧(12m x 132),我试图按列计算唯一值的数量,并删除只有一个唯一值的列

到目前为止,我使用了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)
将熊猫作为pd导入
df=sql\u dw.read\u table()
df_p=df.toPandas()
nun=df_p.nunique(轴=0)
nundf=pd.DataFrame({'atr':nun.index,'countU':nun.values})
删除=[]
对于nundf.values中的i,j:
如果j==1:
删除。追加(i)
df=df.下降(i)
打印(已删除)

是否有一种更适合spark的方法?即不使用熊猫?

我很抱歉,我没有pyspark中的解决方案,而是纯spark中的解决方案,如果您找不到pyspark方法,可以转让或使用

你可以创建一个空白列表,然后使用一个FrACH,检查哪些列具有不同的计数1,然后将它们追加到空白列表中。p> 从那里,您可以使用列表作为过滤器,并从数据框中删除这些列

    var list_of_columns: List[String] = ()

    df_p.columns.foreach{c => 
      if (df_p.select(c).distinct.count == 1)
         list_of_columns ++= List(c)

    df_p_new = df_p.drop(list_of_columns:_*)



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

导入pyspark.sql.F函数
#创建数据帧
列=['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,列)
df.show()
#我们创建一个要应用的函数列表
#在这种情况下,每列的countDistinct
expr=[F.countDistinct(c).df.columns中c的别名(c)]
#我们应用这些功能
countdf=df.选择(*expr)
#这个df只有一行
countdf.show()
#我们提取只有一个值的列
cols2drop=[k代表k,v在countdf.collect()[0]中。asDict().items()如果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|
+----+---+

您可以按该列对df进行分组,并计算该列的不同值:

df = df.groupBy("column_name").agg(countDistinct("column_name").alias("distinct_count"))
然后按多于1个不同的_计数的行过滤df:

df = df.filter(df.distinct_count > 1)

您可以在中使用countDistinct函数spark@dassum能否提供一个使用countDistinct删除只有一个唯一值的列的示例?