我在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'}
感谢您的想法和帮助。
答案 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']}]
通过这种方式,您只需要在处理后收集即可。
请让我知道这是否适合您:)