所以我有一个由OrderedDict元素组成的CollectionRDD。我想对它们执行KMeans集群分析,但要做到这一点,我需要首先将它们全部放入一个数据帧中。在pyspark有办法做到这一点吗?
例如,如果我有以下两个字典:
{"A":"1","B":"BEE","C":"123","Username":"john"}
{"B":"MN","C":"87","D":"Apple"}
我想要一个看起来像的数据帧RDD
A B C D Username
1 Bee 123 john
MN 87 Apple
我知道我可以用普通python中的for循环迭代地做这类事情,但我要处理大量数据,所以我想用pyspark来执行操作
感谢
如果您的数据是平面的,如示例所示,最简单的方法就是映射到Row
并调用DF
。
from pyspark.sql import Row
keys = ('A', 'B', 'C', 'D', 'Username')
row = Row(*keys)
rdd = sc.parallelize([
OrderedDict([('A', '1'), ('B', 'BEE'), ('C', '123'), ('Username', 'john')]),
OrderedDict([('B', 'MN'), ('C', '87'), ('D', 'Apple')])
])
df = rdd.map(lambda xs: row(*(xs.get(k) for k in keys))).toDF()
df.show()
## +----+---+---+-----+--------+
## | A| B| C| D|Username|
## +----+---+---+-----+--------+
## | 1|BEE|123| null| john|
## |null| MN| 87|Apple| null|
## +----+---+---+-----+--------+
警告:
也可以在没有中间RDD[Row]
的情况下直接转换为DF,但这种方法已经被弃用,并且不是特别健壮。