【问题标题】:Saving all dictionary keys in one save一次保存所有字典键
【发布时间】:2017-01-20 11:08:26
【问题描述】:

我有一个具有这种结构的rdd:

[ 
    ('Washington', 
      [
        {'age': 15, 'name': 'John', 'extra_info1': 'data'},
        {'age': 25 , 'name': 'David', 'extra_info1': 'data'} 
      ]),
    ('New York',
      [
        {'age' 50, 'name': 'Mike', 'extra_info2': 'blob'},
        {'age' 24, 'name': 'Fred', 'extra_info2': 'blob3'}
      ])
]

如您所见,我有城市的钥匙,然后是里面的人的听写列表。在所有键中,字典中有一些共享键,例如年龄和姓名,但每个字典也有唯一键。

现在要将其输出到 csv 我迭代 rdd 的每个键,将字典列表转换为 spark.sql.Row 的 rdd 并从 rdd 创建数据框,然后我使用 com.databricks.spark.csv 保存每个数据帧到 hdfs 中的 csv。

我就是这样做的:

for key in rdd.keys().toLocalIterator():
    city_rdd = rdd.filter(lambda k: k[0] == key)
    city_rdd = city_rdd.map(lambda kv: kv[1]) # return only data without key
    city_rdd_rows = city.rdd.map(lambda r: spark.sql.Row(r))
    city_df = city_rdd.toDF()
    # save the city_df to csv with com.databricks.spark.csv.. i dont have the snippet here

问题是我有很多像华盛顿和纽约这样的元组键,每次保存文件需要 1-2 分钟,而不是并行保存所有 csvs 并节省时间。

我已经阅读了this,但是当我无法使其与 csv 输出一起工作时,当我尝试 json 输出时,我看到 jsons 键只是我的共享键,如“年龄”和“姓名” rdd.

我该怎么办?

【问题讨论】:

    标签: apache-spark pyspark pyspark-sql


    【解决方案1】:

    您可以编写一个 Python 函数,将 csv 文件写入所有工作人员都可以访问的网络位置,然后使用 .map() 函数执行它,如下所示:

    import csv
    
    def csv_writer(data):
        city, mydicts = data
    
        open('//network/location/{}.csv'.format(city), 'w', newline='') as csvfile:
            writer = csv.writer(csvfile)
            for single_dict in mydicts:
                for key, value in single_dict.items():
                     writer.writerow([key, value])
    
    
    city_rdd.map(csv_writer).count() #.count() is needed to inniate the action
    

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 1970-01-01
      • 2016-05-02
      • 2012-09-22
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多