我有一个spark数据集的格式-
+--------------+--------+-----+
|name |type |cost |
+--------------+--------+-----+
|AAAAAAAAAAAAAA|XXXXX |0.24|
|AAAAAAAAAAAAAA|YYYYY |1.14|
|BBBBBBBBBBBBBB|XXXXX |0.78|
|BBBBBBBBBBBBBB|YYYYY |2.67|
|BBBBBBBBBBBBBB|ZZZZZ |0.15|
|CCCCCCCCCCCCCC|XXXXX |1.86|
|CCCCCCCCCCCCCC|YYYYY |1.50|
|CCCCCCCCCCCCCC|ZZZZZ |1.00|
+--------------+--------+----+
我想把它转换成一个-
public class CostPerName {
private String name;
private Map<String, Double> costTypeMap;
}
我想要的是,
+--------------+-----------------------------------------------+
|name | typeCost. |
+--------------+-----------------------------------------------+
|AAAAAAAAAAAAAA|(XXXXX, 0.24), (YYYYY, 1.14) |
|BBBBBBBBBBBBBB|(XXXXX, 0.78), (YYYYY, 2.67), (ZZZZZ, 0.15) |
|CCCCCCCCCCCCCC|(XXXXX, 1.86), (YYYYY, 1.50), (ZZZZZ, 1.00) |
+--------------+-----------------------------------------------+
i、 例如,对于每个 name
,我想要一张Map (type, cost)
.
实现这种转变的有效途径是什么?我可以使用一些Dataframe转换吗?我尝试了groupby,但只有在执行sum、avg等聚合查询时,它才会起作用。
2条答案
按热度按时间bwitn5fc1#
您可以将“类型”和“成本”这两个列组合成一个新的结构列,然后按名称分组,并使用collect\u list作为聚合函数:
这将产生如下Dataframe:
t2a7ltrp2#
你可以使用
map_from_arrays()
如果您的spark版本允许: