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

时间:2018-03-23 10:41:36

标签: apache-spark dataframe pyspark

我有一个包含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进行保存。我需要在同一条路径中多次保存文件。

2 个答案:

答案 0 :(得分: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 *

答案 1 :(得分:1)

您可以使用以下行轻松地连接列(假设您要使用位置文件而不是定界文件,对定界文件使用此方法将需要在每个数据列之间使用定界符列):

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

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

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