【问题标题】:How to pivot on more than one column for a spark dataframe?如何在火花数据框的多个列上进行旋转?
【发布时间】:2021-04-21 17:39:20
【问题描述】:

我们如何才能以数据框中的多个列为中心。 例如这里提到的例子, https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-pivot.html

SELECT * FROM person
    PIVOT (
        SUM(age) AS a, AVG(class) AS c
        FOR (name, age) IN (('John', 30) AS c1, ('Mike', 40) AS c2)
    );

这里的 Pivot 是在 (name,age) 上完成的。 我们不能在 Spark scala 的 pivot 方法中传递多个参数,因为它只需要一个列名作为参数。 我们如何对数据框进行类似的操作?

【问题讨论】:

    标签: java scala apache-spark apache-spark-sql pivot


    【解决方案1】:

    您可以将数组列传递给pivot

    val df2 = df.groupBy("id","address")
                .pivot(array("name","age"), 
                       Seq(array(lit("John"),lit("30")).as("c1"), 
                           array(lit("Mike"),lit("40")).as("c2")))
                .agg(sum('age).as("a"), avg('class).as("c"))
    
    df2.show
    +---+-------+----+----+----+----+
    | id|address|c1_a|c1_c|c2_a|c2_c|
    +---+-------+----+----+----+----+
    |200|Street2|null|null|null|null|
    |100|Street1|30.0| 1.0|null|null|
    |400|Street4|null|null|null|null|
    |300|Street3|null|null|null|null|
    +---+-------+----+----+----+----+
    

    【讨论】:

    • 非常感谢您的回答!我正在尝试运行类似的查询。 project1.groupBy("mgr").pivot(array("job","deptno"), Seq(array(lit("MANAGER"),lit("20")).as("c10"), array( lit("CLERK"),lit("10")).as("m20"))).agg(sum(project1.col("sal")).alias("ss"), count("*" ).alias("c")).show 并得到这个错误 "java.lang.RuntimeException: Unsupported literal type class org.apache.spark.sql.Column array(MANAGER, 20) AS c10" 知道什么可以是这里的问题吗?
    • @Ashutosh 打开另一个问题会更合适,因为没有足够的详细信息并且没有示例数据框。请在新问题中包含必要的详细信息,谢谢
    • 您的回答对我帮助很大。关于我的最后一条评论, lit() 似乎对我不起作用。我尝试使用 withColumn() 连接两列并将其传递给枢轴。有效。 project1.withColumn("p", concat($"job", $"deptno")).groupBy("mgr").pivot("p").agg(sum(project1.col("salary")). alias("ss"), count("*").alias("c")).show
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 2020-01-03
    • 2017-12-11
    相关资源
    最近更新 更多