繁体   English   中英

将Pyspark Dataframe中的数据导出到Dictionary或List中以进一步处理Python

[英]Export data from Pyspark Dataframe into Dictionary or List for further processing Python

我试图在Pyspark确实找到连接组件之后从Pyspark Dataframe中检索值,但我不知道如何从列表中提取数据。

下面是从我正在使用的大型数据集创建的表的简化版本。 实质上,通过使用图的顶点和边的连接数据来创建下表。 如果组件编号相同,则表示节点(ID)位于相同的图形结构中。


    +---+------------+
    | id|   component|
    +---+------------+
    |  0|154618822656|
    |  1|154618822656|
    |  2|154618822656|
    |  3|154618822656|
    |  4|420906795008|
    |  5|420906795008|
    +---+------------+

我已经尝试了很多东西来将数据提取到我最常用的列表和词典中。 当我在文档中尝试各种方法时,我得到如下输出:

[Row(id='0', component=154618822656), Row(id='1', component=154618822656)]

我不知道该怎么做。 我在Pyspark中也看到了一个asDict()方法,但即使是一个简单的表,也无法让它工作。

这是一个示例函数,它接受graphframe,查找连接的组件并创建表。 一切都很好,直到我想将数据放在另一个结构中:

def get_connected_components(graphframe):
    connected_table = g.connectedComponents()
    connected_table.collect()
    conn = connected_table.rdd.take(2)
    print(conn)

我最终想要这样的东西:

{"154618822656" : {0, 1}, "420906795008": {2, 3, 4, 5}}

我会变成另一个输出,如:

0 1
2 3 4 5

这可能是如何操作这些表格的错误路线,但我对Pyspark来说是全新的,并且惊讶于即使在所有搜索中这也是多么棘手。 先感谢您。

不完全确定你要做什么,但这里有一些关于字典和列表转换的方法,通过Spark应该有所帮助。 需要注意的一件非常重要的事情是,如果你想使用像list / dict这样的结构,那么我建议你在一台机器上工作(如果你的数据集适合内存),而不是试图通过Spark分配计算只收集所有数据到一台机器做更多的处理。 由于您正在使用Spark GraphFrames,因此还有一些不错的单机Python图形包。 希望这可以帮助。

# load your sample data set
data = [(0, 154618822656),\
        (1, 154618822656),\
        (2, 154618822656),\
        (3, 154618822656),\
        (4, 420906795008),\
        (5, 420906795008),]

df = spark.createDataFrame(data, ("id", "comp"))

df.show()

+---+------------+
| id|        comp|
+---+------------+
|  0|154618822656|
|  1|154618822656|
|  2|154618822656|
|  3|154618822656|
|  4|420906795008|
|  5|420906795008|
+---+------------+

# get desired format like {"154618822656" : {0, 1}, "420906795008": {2, 3, 4, 5}} from your post
from pyspark.sql.functions import collect_list

df.groupBy("comp").agg(collect_list("id").alias("id")).show()
+------------+------------+
|        comp|          id|
+------------+------------+
|154618822656|[0, 1, 2, 3]|
|420906795008|      [4, 5]|
+------------+------------+

# you can convert col to a list ***collect() is not recommended for larger datasets***
l = [i for i in df.select("id").rdd.flatMap(lambda x: x).collect()]

print(type(l))
print(l)
<class 'list'>
[0, 1, 2, 3, 4, 5]

# write to json so you can get a dictionary format like you were mentioning
df.groupBy("comp").agg(collect_list("id").alias("id")).write.json("data.json")

! cat data.json/*.json
{"comp":154618822656,"id":[0,1,2,3]}
{"comp":420906795008,"id":[4,5]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM