将pyspark数据框写入文本文件

Posted

技术标签:

【中文标题】将pyspark数据框写入文本文件【英文标题】:writing pyspark data frame to text file 【发布时间】:2021-04-22 16:08:28 【问题描述】:

我有一个 pyspark 数据框,它是从 sql server 中的一个表创建的,并且 我对此进行了一些转换,现在我将其转换为 动态数据框,以便将其保存为文本文件 在 s3 存储桶中。当我将数据框写入文本文件时,我将 向该文件添加另一个标题。

这是我将保存为文件的动态数据框:

AT_DATE | AMG_INS | MONTHLY_AVG

2021-03-21 | MT.0000|  234.543

2021_02_12| MT.1002 |  34.567

我想在保存文本文件时在其上添加另一个标题,我需要像这样添加另一行:

HDR,FTP,PC

AT_DATE,AMG_INS,MONTHLY_AVG

2021-03-21,MT.0000,234.543

2021_02_12,MT.1002,34.567

这是我需要在文本文件顶部添加的单独行。

【问题讨论】:

你能提供你已有的代码吗? 【参考方案1】:

要将您的数据框保存为带有附加标题行的文本文件,您必须执行以下步骤:

准备你的数据数据框

由于您只能将一列数据帧写入文本,因此您首先使用 concat_ws spark SQL 函数将所有值连接到一个 value 列中 然后使用 select 数据框方法删除除 value 列之外的所有列 您添加了一个 order 列,其字面值为 2,稍后将使用它来确保标题位于输出文本文件的顶部

准备您的标头数据框

您创建一个 headers 数据框,每个所需的标题包含一行。每行有两列:

value 列包含作为字符串的标题 order 列包含作为 int 的标题顺序(0 用于第一个标题,1 用于第二个标题)

编写标头和数据数据帧的并集

您使用union 数据框方法将您的第一个数据框与headers 数据框合并 您使用coalesce(1) 数据框方法只输出一个文本文件 您使用 orderBy 数据框方法按您的 order 列对数据框进行排序 您删除了您的订单列 然后您编写生成的数据帧

完整代码

翻译成代码,它给你下面的代码sn-p。我打电话给你的动态数据框output_dataframe 和你的火花会话spark 我写信给/tmp/to_text_file

from pyspark.sql import functions as F

data = output_dataframe \
    .select(F.concat_ws(',', F.col("AT_DATE"), F.col("AMG_INS"), F.col("MONTHLY_AVG")).alias('value')) \
    .withColumn('order', F.lit(2))

headers = sparkSession.createDataFrame([('HDR,FTP,PC', 0), ('AT_DATE,AMG_INS,MONTHLY_AVG', 1)], ['value', 'order'])

headers.union(data) \
    .coalesce(1) \
    .orderBy('order')\
    .drop('order') \
    .write.text("/tmp/to_text_file")

【讨论】:

以上是关于将pyspark数据框写入文本文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将存储在 HDFS 中包含行的文本文件转换为 Pyspark 中的数据框?

从集群将整数/字符串写入 pyspark 中的文本文件

将胶水pyspark错误写入文本文件

如何使用 pyspark 从文本日志文件的特定部分创建数据框

Pyspark 合并两个大文本文件

从文本文件创建数据框,在 pyspark 中不起作用