apache-spark - Spark 数据集:数据转换
问题描述
我有一个格式的 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) |
+--------------+-----------------------------------------------+
即,对于每个name
,我想要一张(type, cost)
.
实现这种转变的有效方法是什么?我可以使用一些数据帧转换吗?我尝试了 groupBy 但这只有在我执行 sum、avg 等聚合查询时才有效。
解决方案
您可以将两个列 type 和 cost 组合成一个新的struct列,然后按名称分组并使用collect_list作为聚合函数:
df.withColumn("type_cost", struct("type", "cost"))
.groupBy("name").agg(collect_list("type_cost"))
这将产生一个像这样的数据框:
+--------------+---------------------------------------------+
|name |collect_list(type_cost) |
+--------------+---------------------------------------------+
|AAAAAAAAAAAAAA|[[XXXXX, 0.24], [YYYYY, 1.14]] |
|CCCCCCCCCCCCCC|[[XXXXX, 1.86], [YYYYY, 1.50], [ZZZZZ, 1.00]]|
|BBBBBBBBBBBBBB|[[XXXXX, 0.78], [YYYYY, 2.67], [ZZZZZ, 0.15]]|
+--------------+---------------------------------------------+
推荐阅读
- python - 将列表中的元素数更改为数字 N
- hyperledger-fabric - 使用 VS Code Extension 容器不适用于 Hyperledger Fabric
- pandas - 解密 Fernet CSV,编码问题?熊猫
- consul - 领事锁没有被释放
- flutter - 如何通过提供者调用特定小部件中的方法
- javascript - 如何更新减速器功能中检查/取消检查条件的状态 - redux react
- c# - 地图列表
列出 - haskell - 如何将类型级列表转换为对链
- .htaccess - 将 www.example.com 和 https://www.example.com 重定向到 https://example.com
- javascript - 在反应中默认表单加载的特定用户值