不带汇总的Spark Dataframe数据透视

时间:2019-11-08 16:29:28

标签: python scala apache-spark pivot

我有一堆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列名在行urgh上

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

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

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

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

因此,从本质上讲,给定在json ..中定义数据的烦人方式。还有一种更好的方法来实现此目的:

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

需要回家,整整一天..可能缺少明显的东西,ta!

1 个答案:

答案 0 :(得分:1)

发布此消息后不到5分钟,我就知道了。

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

??