我的 DataFrame 具有以下结构:
df = spark.createDataFrame(
[('B', 'a', 10),
('B', 'b', 20),
('C', 'c', 30)],
['Brand', 'Type', 'Amount'])
df.show()
# +-----+----+------+
# |Brand|Type|Amount|
# +-----+----+------+
# | B| a| 10|
# | B| b| 20|
# | C| c| 30|
# +-----+----+------+
我想通过将 type
和 amount
分组到 type 的单个列中来减少行数:Map
。
所以 Brand
将是唯一的,并且 MAP_type_AMOUNT
将为每个 type
amount
提供 key,value
> 组合。
我想,spark.sql 可能有一些功能可以做到这一点,还是我必须使用 RDD 并“自己”转换为 map 类型?
预期输出:
---------------------------
| Brand | MAP_type_AMOUNT |
---------------------------
| B | {a: 10, b:20} |
| C | {c: 30} |
---------------------------
最佳答案
对 Prem's 略有改进回答(对不起,我还不能发表评论)
使用 func.create_map
而不是 func.struct
。参见 documentation
import pyspark.sql.functions as func
df = sc.parallelize([('B','a',10),('B','b',20),
('C','c',30)]).toDF(['Brand','Type','Amount'])
df_converted = df.groupBy("Brand").\
agg(func.collect_list(func.create_map(func.col("Type"),
func.col("Amount"))).alias("MAP_type_AMOUNT"))
print df_converted.collect()
输出:
[Row(Brand=u'B', MAP_type_AMOUNT=[{u'a': 10}, {u'b': 20}]),
Row(Brand=u'C', MAP_type_AMOUNT=[{u'c': 30}])]
关于python - 以 map 类型创建 DataFrame 分组列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45532183/