【问题标题】:Pyspark dataframe write to single json file with specific namePyspark 数据框写入具有特定名称的单个 json 文件
【发布时间】:2017-09-02 07:32:32
【问题描述】:

我有一个数据框,我想将它写为具有特定名称的单个 json 文件。我在下面尝试过

df2 = df1.select(df1.col1,df1.col2)
df2.write.format('json').save('/path/file_name.json') # didnt work, writing in folder 'file_name.json' and files with part-XXX
df2.toJSON().saveAsTextFile('/path/file_name.json')  # didnt work, writing in folder 'file_name.json' and files with part-XXX

感谢有人可以提供解决方案。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    这是另一种方法:

    import os
    df2 = df1.select(df1.col1,df1.col2)
    df2.write.format('json').save('/path/folder_name')
    
    os.system("cat /path/folder_name/*.json > /path/df.json")
    os.system("rm -rf /path/folder_name")
    

    假设这是在分析阶段完成的,并且导出为单个 json 不会被带入 prod。

    【讨论】:

      【解决方案2】:

      Pyspark 将文件存储在较小的块中,据我所知,我们不能使用单个给定文件名直接存储 JSON。我认为这个小 python 函数将有助于你想要实现的目标。

      def saveResult (data_frame, temp_location, file_path):
          data_frame.write.mode('append').json(temp_location)
          file = dbutils.fs.ls(temp_location)[-1].path # last file is the json or can also use regex to determine this
          dbutils.fs.cp(file, file_path)
          dbutils.fs.rm(temp_location, recurse=True)
      

      基本上,这里发生的事情是您传递数据框、存储所有文件块的 temp_location 以及您希望作为输出文件获得的完整文件路径(文件路径 + 文件名)。该函数生成块,删除所有块,并将最终文件以所需文件名保存到所需位置。

      【讨论】:

        【解决方案3】:

        您可以通过之前转换为 pandas df 来做到这一点:

        df.toPandas().to_json('path/file_name.json', orient='records', force_ascii=False, lines=True)
        

        【讨论】:

          【解决方案4】:

          您需要使用以下代码将其保存在单个文件中:-

          df2 = df1.select(df1.col1,df1.col2)
          df2.coalesce(1).write.format('json').save('/path/file_name.json')
          

          这将创建一个带有file_name.json 的文件夹。检查这个文件夹你可以得到一个包含整个数据的文件part-000

          【讨论】:

          • 我想写一个特定的名字file_name.json。除了重命名之外,有没有直接的写法?
          • 而不是写这个 file_name.json 使用你的名字像 file_name
          • 因为您使用的是 spark,所以您的数据分布在多个节点上,并行计算并部分发送到您的目录。使用 spark 的原因之一是数据不能存储在本地。所以这就是数据的输出方式。您的文件越大,通过的“部分”文件就越大。
          • @LijjuMathew:这应该是你要找的东西:stackoverflow.com/a/60442604/530399
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 2020-11-07
          • 2023-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多