【问题标题】:Spark : Pivot with multiple columnsSpark:具有多列的枢轴
【发布时间】:2017-08-14 22:07:03
【问题描述】:

我正在 Spark 中阅读以下 json 文件:

{"id" : "123", "category" : "A"}
{"id" : "456", "category" : "B"}
{"id" : "567", "category" : "C"}
{"id" : "678", "category" : "D"}
{"id" : "789", "category" : "E"}
{"id" : "123", "category" : "B"}
{"id" : "123", "category" : "C"}

我想pivot它来生成类别的mxn矩阵。以下是我的代码:

val df = spark.read.json("test.json")
val pivots = df.groupBy("category").pivot("category").count()
pivots.show()

这会生成以下输出:

+--------+----+----+----+----+----+
|category|   A|   B|   C|   D|   E|
+--------+----+----+----+----+----+
|       E|null|null|null|null|   1|
|       B|null|   2|null|null|null|
|       D|null|null|null|   1|null|
|       C|null|null|   2|null|null|
|       A|   1|null|null|null|null|
+--------+----+----+----+----+----+

我真正想做的是,以id 为轴,并在此矩阵中显示计数。例如。 id '123' 映射到类别ABC,所以我希望上面的矩阵显示1 的值A-AA-BA-C(反之亦然) ),目前,它只显示A-A1 值。

我将代码更改为 group by 'id' 但这会导致第一列中的 id 值而我想要类别。

有什么办法可以做到这一点(也许使用完全不同的方法)?

【问题讨论】:

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


    【解决方案1】:

    重命名列并应用自联接:

    val leftRight = df
      .withColumnRenamed("category", "left")
      .join(df.withColumnRenamed("category", "right"), Seq("id"))
    

    获取每个 id 的共现。接下来申请crosstab

    leftRight.stat.crosstab("left", "right")
    

    汇总所有 id 的数据。结果是:

    +----------+---+---+---+---+---+
    |left_right|  A|  B|  C|  D|  E|
    +----------+---+---+---+---+---+
    |         E|  0|  0|  0|  0|  1|
    |         A|  1|  1|  1|  0|  0|
    |         B|  1|  2|  1|  0|  0|
    |         C|  1|  1|  2|  0|  0|
    |         D|  0|  0|  0|  1|  0|
    +----------+---+---+---+---+---+
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 2018-08-28
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多