如果我用Java保存数据框,......:
df.write().parquet("myTest.parquet");
...,然后它以hadoopish方式保存(包含大量文件的文件夹)。
是否可以将数据框保存为单个文件?我试过了collect()
,但没有帮助。
如果不可能,那么我的问题是如何更改用于从df.write().parquet("myTest.parquet")
创建的hadoopish文件夹中读取Parquet文件的Python代码:
load_df = sqlContext.read.parquet("myTest.parquet").where('field1="aaa"').select('field2', 'field3').coalesce(64)
答案 0 :(得分:1)
是否可以将数据框保存为单个文件?
是的,但你不应该因为你可能对单个JVM施加太大的压力,这不仅会导致性能下降,还会导致JVM终止,从而导致整个Spark应用程序失败。
所以,是的,它是可能的,您应该repartition(1)
拥有一个分区:
repartition(numPartitions:Int):Dataset [T] 返回一个具有正好numPartitions分区的新数据集。
如何更改用于从hadoopish文件夹中读取Parquet文件的Python代码
从您调用数据集时加载数据集" hadoopish"文件夹根本不关心内部结构,并将其视为单个文件(即封面下的目录)。
内部表示表示文件的存储方式,并且不会影响加载文件的代码。
答案 1 :(得分:1)
Spark将你的文件写入一个目录,这个文件就像你说的那么多,如果写入操作成功,它会保存另一个名为_SUCCESS
的空文件
我来自scala,但我相信在python中有类似的方式
以parquet
或json
或您想要的任何格式保存和阅读您的文件非常简单:
df.write.parquet("path")
loaddf = spark.read.parquet("path")
我尝试过collect(),但没有帮助。
谈到collect
,在这样的操作中使用它并不是一个好习惯,因为它会将您的数据返回给驱动程序,因此您将失去并行计算的好处,如果OutOfMemoryException
,它将导致repartition(1)
数据不能适合内存
是否可以将数据框保存为单个文件?
在主要情况下,您确实不需要这样做,如果是这样,请在保存前Dataframe
使用inline void keep_window_open()
{
cin.clear();
cout << "Please enter a character to exit\n";
char ch;
cin >> ch;
return;
}
方法
希望它有所帮助,最好的问候