【问题标题】:How to aggregate columns into a JSON array?如何将列聚合到 JSON 数组中?
【发布时间】:2018-03-16 09:04:03
【问题描述】:

如何转换如下数据以便将数据存储在 ElasticSearch 中?

这是一个 bean 的数据集,我将按产品将其聚合到 JSON 数组中。

List<Bean> data = new ArrayList<Bean>();
data.add(new Bean("book","John",59));
data.add(new Bean("book","Björn",61));
data.add(new Bean("tv","Roger",36));
Dataset ds = spark.createDataFrame(data, Bean.class);

ds.show(false);

+------+-------+---------+
|amount|product|purchaser|
+------+-------+---------+
|59    |book   |John     |
|61    |book   |Björn    |
|36    |tv     |Roger    |
+------+-------+---------+


ds = ds.groupBy(col("product")).agg(collect_list(map(ds.col("purchaser"),ds.col("amount")).as("map")));
ds.show(false);

+-------+---------------------------------------------+
|product|collect_list(map(purchaser, amount) AS `map`)|
+-------+---------------------------------------------+
|tv     |[[Roger -> 36]]                              |
|book   |[[John -> 59], [Björn -> 61]]                |
+-------+---------------------------------------------+

这就是我想把它改造成的:

+-------+------------------------------------------------------------------+
|product|json                                                              |
+-------+------------------------------------------------------------------+
|tv     |[{purchaser: "Roger", amount:36}]                                 |
|book   |[{purchaser: "John", amount:36}, {purchaser: "Björn", amount:61}] |
+-------+------------------------------------------------------------------+

【问题讨论】:

  • 先用to_json再用collect_list
  • Spark Row to JSON的可能重复
  • 你能告诉我你会怎么做吗?您关于可能重复的链接没有将聚合功能涵盖到 json 数组中。
  • 太棒了!非常感谢您的帮助 philantrovert !

标签: apache-spark apache-spark-sql


【解决方案1】:

解决办法:

ds.groupBy(col("product"))
  .agg(collect_list(to_json(struct(col("purchaser"), col("amount"))).alias("json")));

【讨论】:

  • 如果可以解决问题,请随时接受您自己的答案。
  • 我又添加了几列,这对我有用,但我发现要让“别名”正常工作,我必须将其转移到 collect_list 而不是 to_json 函数,所以对我来说就像ds.groupBy(col("product")).agg(collect_list(to_json(struct(col("purchaser"), col("amount")))).alias("json"));
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 2021-09-07
  • 2016-09-02
  • 2021-11-24
  • 2020-10-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多