如何使用pyspark将数据框保存在“.txt”文件中

Posted

技术标签:

【中文标题】如何使用pyspark将数据框保存在“.txt”文件中【英文标题】:How to save data frame in ".txt" file using pyspark 【发布时间】:2018-03-23 10:41:35 【问题描述】:

我有一个包含 1000 多列的数据框。我需要将此数据框保存为没有标题的 .txt 文件(而不是 .csv),模式应为“追加”

在下面使用的命令不起作用

df.coalesce(1).write.format("text").option("header", "false").mode("append").save("<path>")

我遇到的错误

pyspark.sql.utils.AnalysisException: 'Text data source supports only a single column,

注意:不应该使用 RDD 来保存。因为我需要在同一个路径中多次保存文件。

【问题讨论】:

除了你尝试过的,你可以提到你得到了什么错误 我已经更新了问题 你想要的输出是什么?你想要空格而不是逗号吗? 【参考方案1】:

如果您想为多列数据框写出文本文件,您必须自己连接列。在下面的示例中,我用空格分隔不同的列值,并用* 替换空值:

import pyspark.sql.functions as F

df = sqlContext.createDataFrame([("foo", "bar"), ("baz", None)], 
                            ('a', 'b'))

def myConcat(*cols):
    concat_columns = []
    for c in cols[:-1]:
        concat_columns.append(F.coalesce(c, F.lit("*")))
        concat_columns.append(F.lit(" "))  
    concat_columns.append(F.coalesce(cols[-1], F.lit("*")))
    return F.concat(*concat_columns)

df_text = df.withColumn("combined", myConcat(*df.columns)).select("combined")

df_text.show()

df_text.coalesce(1).write.format("text").option("header", "false").mode("append").save("output.txt")

这给出了输出:

+--------+
|combined|
+--------+
| foo bar|
|   baz *|
+--------+

你的输出文件应该是这样的

foo bar
baz *

【讨论】:

【参考方案2】:

您可以使用以下行轻松连接列(假设您想要一个位置文件而不是分隔文件,对分隔文件使用此方法将要求您在每个数据列之间都有分隔列):

dataFrameWithOnlyOneColumn = dataFrame.select(concat(*dataFrame.columns).alias('data'))

连接列后,您的上一行应该可以正常工作:

dataFrameWithOnlyOneColumn.coalesce(1).write.format("text").option("header", "false").mode("append").save("<path>")

【讨论】:

以上是关于如何使用pyspark将数据框保存在“.txt”文件中的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 使用名称中的变量将数据框保存到配置单元表

在 Pyspark 中列出保存顺序的数据框列

我可以将 pyspark 数据框保存为哪些文件格式?

找不到pyspark数据框保存到配置单元表

将 pyspark 中的数据框保存为 csv 中的 hivetable

如何将 pyspark 数据帧 1x9 转换为 3x3