PySpark 在广泛的列中获得不同的值
PySpark getting distinct values over a wide range of columns
我的数据包含大量自定义列,我对这些列的内容知之甚少。这些列被命名为 evar1
到 evar250
。我想要得到的是一个具有所有不同值的单个 table,以及这些值发生的频率和列的名称。
------------------------------------------------
| 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)
我是否缺少更好的解决方案?
更新
这已被标记为重复,但 IMO 的两个回复仅解决了我的部分问题。
我正在查看可能非常宽的 tables,其中可能包含大量值。我需要一个简单的方法(即 3 列显示源列、值和源列中值的计数。
第一个回复仅给出了不同值数量的近似值。这对我来说毫无用处。
第二个回答似乎不如第一个相关。澄清一下,源数据如下:
-----------------------
| evar1 | evar2 | ... |
|---------------|-----|
| A | A | ... |
| B | A | ... |
| B | B | ... |
| B | B | ... |
| ...
应该导致输出
--------------------------------
| columnname | value | count |
|------------|-------|---------|
| evar1 | A | 1 |
| evar1 | B | 3 |
| evar2 | A | 2 |
| evar2 | B | 2 |
| ...
使用从 借来的 melt
:
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()
改编自 by user6910411。
我的数据包含大量自定义列,我对这些列的内容知之甚少。这些列被命名为 evar1
到 evar250
。我想要得到的是一个具有所有不同值的单个 table,以及这些值发生的频率和列的名称。
------------------------------------------------
| 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)
我是否缺少更好的解决方案?
更新
这已被标记为重复,但 IMO 的两个回复仅解决了我的部分问题。
我正在查看可能非常宽的 tables,其中可能包含大量值。我需要一个简单的方法(即 3 列显示源列、值和源列中值的计数。
第一个回复仅给出了不同值数量的近似值。这对我来说毫无用处。
第二个回答似乎不如第一个相关。澄清一下,源数据如下:
-----------------------
| evar1 | evar2 | ... |
|---------------|-----|
| A | A | ... |
| B | A | ... |
| B | B | ... |
| B | B | ... |
| ...
应该导致输出
--------------------------------
| columnname | value | count |
|------------|-------|---------|
| evar1 | A | 1 |
| evar1 | B | 3 |
| evar2 | A | 2 |
| evar2 | B | 2 |
| ...
使用从 melt
:
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()
改编自