如何使用pyspark将 Dataframe 保存为“.txt”文件

mw3dktmi  于 2023-10-15  发布在  Spark
关注(0)|答案(3)|浏览(216)

我有一个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来保存。因为我需要在同一路径下多次保存文件。

arknldoa

arknldoa1#

如果你想为一个多列的框架写出一个文本文件,你必须自己连接这些列。在下面的例子中,我用空格分隔不同的列值,并用*替换null值:

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 *
vlf7wbxs

vlf7wbxs2#

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

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

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

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

bkhjykvo3#

您还可以将pyspark对象框架转换为pandas,然后将其保存到文件中。大概是这样的:

df_pyspark = spark.createDataFrame(data, schema=columns)

head_rows = df.toPandas()

string_representation = head_rows.to_string(index=False)

with open("file_name.txt", "w") as file:
    file.write(string_representation)

相关问题