2017-09-13 105 views
1

我想将单个DataFrame保存为2个不同的csv文件(拆分DataFrame) - 其中一个只包含头,另一个包含其余的行。Pyspark - 将数据帧写入2个不同的csv文件

我想将2个文件保存在同一目录下,所以如果可能的话,Spark处理所有逻辑将是最好的选择,而不是使用pandas分割csv文件。

什么是最有效的方法来做到这一点?

感谢您的帮助!

+0

只要做一个子进程调用,然后用bash来做。应该更容易。 – philantrovert

+0

@philantrovert处理〜1TB文件,例如可能会很慢,即使有bash;) –

回答

2

我们假设你有一个名为“df”的数据集。

您可以: 方案一:写两次:

df.write.(...).option("header", "false").csv(....) 
df.take(1).option("header", "true").csv() // as far as I remember, someone had problems with saving DataFrame without rows -> you must write at least one row and then manually cut this row using normal Java or Python file API 

或者你可以用头= true,然后手工切割头,并使用标准的Java API将其放置在新文件中写一次

+0

感谢您的回答。还有一个问题,是不是Spark将2个文件写入不同的目录?是否可以将它们保存在同一目录中? – Young

+0

第二行不会写2行吗? 'take(1)'会取第一行数据,'header,true'会写头文件? – philantrovert

+0

@Young您应该写入单独的文件夹,然后移动文件。不幸的是,文件是按照DataFrame的形式进行分区的。如果要将所有内容保存在一个文件中,请记住使用'repartition(1)' –

0

数据,而无需首标:

df.to_csv("filename.csv", header=False) 

接头,而没有数据:

df_new = pd.DataFrame(data=None, columns=df_old.columns) # data=None makes sure no rows are copied to the new dataframe 
df_new.to_csv("filename.csv") 
+0

它可以,但 - 根据JavaDoc .. PythonDoc? ;)“ .. note ::这个方法应该只在结果熊猫的DataFrame很小时使用,因为所有的数据都被加载到驱动程序的内存中。” –

+0

是的,你是对的! – RetardedJoker