mad*_*die 1 apache-spark apache-spark-sql apache-spark-dataset
我有一个格式为的 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|
+--------------+--------+----+
Run Code Online (Sandbox Code Playgroud)
我想将其转换为类型的对象 -
public class CostPerName {
private String name;
private Map<String, Double> costTypeMap;
}
Run Code Online (Sandbox Code Playgroud)
我想要的是,
+--------------+-----------------------------------------------+
|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) |
+--------------+-----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
即,对于每个name,我想要一张 的地图(type, cost)。
实现这一转变的有效途径是什么?我可以使用一些数据帧转换吗?我尝试了 groupBy 但只有在执行 sum、avg 等聚合查询时才有效。
您可以将两列类型和成本组合成一个新的结构列,然后按名称分组并使用collect_list作为聚合函数:
df.withColumn("type_cost", struct("type", "cost"))
.groupBy("name").agg(collect_list("type_cost"))
Run Code Online (Sandbox Code Playgroud)
这将产生如下数据框:
+--------------+---------------------------------------------+
|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]]|
+--------------+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |