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