scala - 按 Spark 分组后分组

标签 scala apache-spark apache-spark-sql

我有一个包含 4 列 co1col2col3col4 的数据框。我需要:

  • 根据键 col1col2 对数据帧进行分组
  • 然后对 col3col4 等其他列进行分组,并显示 col3col4 的计数。

输入

col1 col2 col3 col4
 1    1    2    4
 1    1    2    4
 1    1    3    5

输出

col1 col2 col_name col_value  cnt
1     1    col3      2         2
1     1    col3      3         1
1     1    col4      4         2
1     1    col4      5         1

这可能吗?

最佳答案

这是类似melt操作的情况。您可以使用 ahue 提供的实现如an answerHow to melt Spark DataFrame? .

val df = Seq(
  (1, 1, 2, 4), (1, 1, 2, 4), (1, 1, 3, 5)
).toDF("col1", "col2", "col3", "col4")


df.melt(
  Seq("col1", "col2"), Seq("col3", "col4"), "col_name", "col_value"
).groupBy("col1", "col2", "col_name", "col_value").count.show
// +----+----+--------+---------+-----+
// |col1|col2|col_name|col_value|count|
// +----+----+--------+---------+-----+
// |   1|   1|    col3|        3|    1|
// |   1|   1|    col4|        5|    1|
// |   1|   1|    col4|        4|    2|
// |   1|   1|    col3|        2|    2|
// +----+----+--------+---------+-----+

关于scala - 按 Spark 分组后分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50069765/

相关文章:

scala - Quill onconflict更新多个值

python - 使用 Spark DataFrames 对多个字符串分类特征进行一次性编码

pyspark - 如何将日期类型的列转换为日期时间,并向其中添加一些分钟?

linux - 如何使 intellij Idea 使用 #! 正确突出显示 Scala 脚本? (shebang)

java - 类型安全配置 - 从程序设置占位符值

scala - 如何使用 saveAsTextFile 在 spark 数据框中进行自定义分区

apache-spark - Spark Context 不会在 Scala Spark Shell 中自动创建

python - 将多列与另一列进行比较时,选择立即较小/较大的值

scala - @transient 惰性 val 字段序列化

apache-spark - 在将 PySpark 作业提交到 Google Dataproc 时从 requirements.txt 初始化虚拟环境