在pyspark中将行转换为Dictionary

时间:2018-03-22 15:10:22

标签: pyspark

我在pyspark中有一个DataFrame(df),通过从hive表中读取:

df=spark.sql('select * from <table_name>')


+++++++++++++++++++++++++++++++++++++++++++
|  Name    |    URL visited               |
+++++++++++++++++++++++++++++++++++++++++++
|  person1 | [google,msn,yahoo]           |
|  person2 | [fb.com,airbnb,wired.com]    |
|  person3 | [fb.com,google.com]          |
+++++++++++++++++++++++++++++++++++++++++++

当我尝试以下操作时,出现错误

df_dict = dict(zip(df['name'],df['url']))
"TypeError: zip argument #1 must support iteration."

type(df.name) is of 'pyspark.sql.column.Column'

如何创建如下的字典,稍后可以在

上进行迭代
{'person1':'google','msn','yahoo'}
{'person2':'fb.com','airbnb','wired.com'}
{'person3':'fb.com','google.com'}

感谢您的想法和帮助。

4 个答案:

答案 0 :(得分:8)

我认为您可以尝试figure imagesc(transpose(all_area_for_visual)); colormap("jet") xlim([0,250000]); xlabel('Time (s)') yticks([all_area_for_visual(1,:)]) ,此代码直接在执行程序上运行,并且您不必在驱动程序上收集数据。

类似的东西:

row.asDict()

答案 1 :(得分:3)

如果您希望将结果放在python词典中,可以使用collect() 1 将数据带入本地内存,然后根据需要按下输出。

首先收集数据:

df_dict = df.collect()
#[Row(Name=u'person1', URL visited=[u'google', u'msn,yahoo']),
# Row(Name=u'person2', URL visited=[u'fb.com', u'airbnb', u'wired.com']),
# Row(Name=u'person3', URL visited=[u'fb.com', u'google.com'])]

这将返回pyspark.sql.Row个对象的列表。您可以轻松将其转换为dict s列表:

df_dict = [{r['Name']: r['URL visited']} for r in df_dict]
#[{u'person1': [u'google', u'msn,yahoo']},
# {u'person2': [u'fb.com', u'airbnb', u'wired.com']},
# {u'person3': [u'fb.com', u'google.com']}]

1 请注意,对于大型数据集,此操作可能很慢,并且可能因内存不足错误而失败。您应该考虑这是否是您真正想要做的事情,因为您将通过将数据带入本地内存而失去spark的并行化优势。

答案 2 :(得分:1)

如何使用pyspark Row.as_Dict()方法?这是dataframe API的一部分(在撰写本文时,我理解这是“推荐的” API),完全不需要您使用RDD API。

df_list_of_dict = [row.asDict() for row in df.collect()]

type(df_list_of_dict), type(df_list_of_dict[0])
#(<class 'list'>, <class 'dict'>)

df_list_of_dict
#[{'person1': ['google','msn','yahoo']},
# {'person2': ['fb.com','airbnb','wired.com']},
# {'person3': ['fb.com','google.com']}]

答案 3 :(得分:0)

给出:

+++++++++++++++++++++++++++++++++++++++++++
|  Name    |    URL visited               |
+++++++++++++++++++++++++++++++++++++++++++
|  person1 | [google,msn,yahoo]           |
|  person2 | [fb.com,airbnb,wired.com]    |
|  person3 | [fb.com,google.com]          |
+++++++++++++++++++++++++++++++++++++++++++

这应该有效:

df_dict = df \
    .rdd \
    .map(lambda row: {row[0]: row[1]}) \
    .collect()

df_dict

#[{'person1': ['google','msn','yahoo']},
# {'person2': ['fb.com','airbnb','wired.com']},
# {'person3': ['fb.com','google.com']}]

通过这种方式,您只需要在处理后收集即可。

请让我知道这是否适合您:)