将字典保存为 pyspark 数据框并加载它 - Python、Databricks

Posted

技术标签:

【中文标题】将字典保存为 pyspark 数据框并加载它 - Python、Databricks【英文标题】:Save dictionary as a pyspark Dataframe and load it - Python, Databricks 【发布时间】:2019-11-20 19:42:32 【问题描述】:

我有一本字典如下:

my_dict = 'a':[12,15.2,52.1],'b':[2.5,2.4,5.2],'c':[1.2,5.3,12]

我想将这本字典保存在 Databricks 中,这样我就不会在每次开始使用它时都获得它。此外,我想知道如何检索它并再次恢复其原始形式。

我尝试过以下操作:

from itertools import zip_longest 

column_names, data = zip(*my_dict.items())
spark.createDataFrame(zip_longest(*data), column_names).show()

column_names, data = zip(*dict_brands.items())

spark.createDataFrame(zip(*data), column_names).show()

但是,我收到以下错误:

zip_longest argument #10342 必须支持迭代

我也不知道如何重新加载或上传。我尝试了一个示例数据框(不是同一个),如下所示:

df.write.format("tfrecords").mode("overwrite").save('/data/tmp/my_df')

错误是:

属性名称“my_column”包含无效字符 其中 " ,;()\n\t=".请使用别名重命名。

最后,为了得到它,我想到了:

my_df = spark.table("my_df") # Get table
df = my_df.toPandas() # Make pd dataframe

然后将其设为字典,但也许有比将其设为数据框然后作为数据框检索并再次转换回字典更简单的方法。

我还想知道解决方案的计算成本,因为实际数据集非常大。

【问题讨论】:

【参考方案1】:

这是我的示例代码,用于逐步实现您的需求。

    将字典转换为 Pandas 数据框

    my_dict = 'a':[12,15.2,52.1],'b':[2.5,2.4,5.2],'c':[1.2,5.3,12]
    
    import pandas as pd
    pdf = pd.DataFrame(my_dict)
    

    将 Pandas 数据帧转换为 PySpark 数据帧

    df = spark.createDataFrame(pdf)
    

    使用parquet 格式将 PySpark 数据帧保存到文件中。此处不支持tfrecords 格式。

    df.write.format("parquet").mode("overwrite").save('/data/tmp/my_df')
    

    将上面保存的文件加载为 PySpark 数据框。

    df2 = spark.read.format("parquet").load('/data/tmp/my_df')
    

    将 PySpark 数据帧转换为字典。

    my_dict2 = df2.toPandas().to_dict()
    

上述这些代码的计算成本取决于您的实际数据集的内存使用情况。

【讨论】:

以上是关于将字典保存为 pyspark 数据框并加载它 - Python、Databricks的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark - 过滤数据框并创建排名列

当我在 AWS EMR Studio 中使用 saveAsTable 保存 PySpark DataFrame 时,它​​会保存在哪里?

Pyspark循环遍历数据框并减少列值

Pyspark 将 JSON 读取为 dict 或 struct 而不是数据帧/RDD

将 pyspark 数据框转换为 python 字典列表

将嵌套字典键值转换为 pyspark 数据框