Pyspark将字典集合RDD矢量化为单个数据帧RDD



所以我有一个由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,但这种方法已经被弃用,并且不是特别健壮。

最新更新