首页 > 解决方案 > Spark Dataframe Pivot w/o Aggregate

问题描述

我有一堆 json 文档,对应于数据库更改..类似于这种格式:

{
    "key": "abc",
    "timestamp": 1573085110000,
    "cols": [{
            "name": "COL1",
            "value": "14",
        }, {
            "name": "COL2",
            "value": "Some Text",
        }
    ]
}

将其加载到 spark 数据框会产生:

+---+-------------+--------------------+
|key|    timestamp|                cols|
+---+-------------+--------------------+
|abc|1573084821000|[[COL1, 14], [COL...|
|def|1573171513000|[[COL1, xx], [COL...|
|   |             |                    |
+---+-------------+--------------------+

我爆炸了cols数组,所以现在 db 列名在行上,呃

+---+----+---------+
|key|name|    value|
+---+----+---------+
|abc|COL1|       14|
|abc|COL2|Some Text|
|   |    |         |
+---+----+---------+

现在,我想到了枢轴……所以我开始写:

dt.groupBy($"key").pivot("name").agg($"value")

在这一点上,我显然意识到 spark 不允许在非数字 cols 上进行聚合..

所以本质上,考虑到数据在 json 中定义的令人讨厌的方式。有没有更好的方法来实现这一点:

+---+----+---------+
|key|COL1|     COL2|
+---+----+---------+
|abc|14  |Some Text|
|   |    |         |
+---+----+---------+

需要回家,度过了漫长的一天.. 可能缺少一些明显的东西,ta!

标签: pythonscalaapache-sparkpivot

解决方案


发布后不到 5 分钟,我想通了..

dt.groupBy($"key").pivot($"name").agg(first($"value"))


推荐阅读