Apache spark PySpark在广泛的列中获得不同的值

Apache spark PySpark在广泛的列中获得不同的值,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我有大量自定义列的数据,我对这些列的内容了解甚少。这些列被命名为evar1到evar250。我想得到的是一个包含所有不同值的表,以及这些值出现的频率和列的名称 ------------------------------------------------ | columnname | value | count | |------------|-----------------------|---------| | evar1 | en-GB

我有大量自定义列的数据,我对这些列的内容了解甚少。这些列被命名为
evar1
evar250
。我想得到的是一个包含所有不同值的表,以及这些值出现的频率和列的名称

------------------------------------------------ 
| columnname | value                 | count   |
|------------|-----------------------|---------|
| evar1      | en-GB                 | 7654321 |
| evar1      | en-US                 | 1234567 |
| evar2      | www.myclient.com      |     123 |
| evar2      | app.myclient.com      |     456 |
| ... 
我能想到的最好的方法就是感觉很糟糕,因为我相信我必须每列阅读一次这些数据(实际上大约有400个这样的列)

i = 1
df_evars = None
while i <= 30:
  colname = "evar" + str(i)
  df_temp = df.groupBy(colname).agg(fn.count("*").alias("rows"))\
    .withColumn("colName", fn.lit(colname))
  if df_evars:
    df_evars = df_evars.union(df_temp)
  else:
    df_evars = df_temp
display(df_evars)
应该会导致输出

--------------------------------
| columnname | value | count   |
|------------|-------|---------|
| evar1      | A     | 1       |
| evar1      | B     | 3       |
| evar2      | A     | 2       |
| evar2      | B     | 2       |
| ... 

使用从以下位置借用的
melt

改编自

--------------------------------
| columnname | value | count   |
|------------|-------|---------|
| evar1      | A     | 1       |
| evar1      | B     | 3       |
| evar2      | A     | 2       |
| evar2      | B     | 2       |
| ... 
from pyspark.sql.functions import col

melt(
    df.select([col(c).cast("string") for c in df.columns]), 
    id_vars=[], value_vars=df.columns
).groupBy("variable", "value").count()