如何从hadoopish文件夹加载镶木地板文件

时间:2017-05-21 10:56:10

标签: java python apache-spark apache-spark-sql pyspark-sql

如果我用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)

2 个答案:

答案 0 :(得分:1)

  

是否可以将数据框保存为单个文件?

是的,但你不应该因为你可能对单个JVM施加太大的压力,这不仅会导致性能下降,还会导致JVM终止,从而导致整个Spark应用程序失败。

所以,是的,它是可能的,您应该repartition(1)拥有一个分区:

  

repartition(numPartitions:Int):Dataset [T] 返回一个具有正好numPartitions分区的新数据集。

  

如何更改用于从hadoopish文件夹中读取Parquet文件的Python代码

从您调用数据集时加载数据集" hadoopish"文件夹根本不关心内部结构,并将其视为单个文件(即封面下的目录)。

内部表示表示文件的存储方式,并且不会影响加载文件的代码。

答案 1 :(得分:1)

Spark将你的文件写入一个目录,这个文件就像你说的那么多,如果写入操作成功,它会保存另一个名为_SUCCESS的空文件

我来自scala,但我相信在python中有类似的方式

parquetjson或您想要的任何格式保存和阅读您的文件非常简单:

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; } 方法

希望它有所帮助,最好的问候