如何从 hadoopish 文件夹加载镶木地板文件
Posted
技术标签:
【中文标题】如何从 hadoopish 文件夹加载镶木地板文件【英文标题】:How to load parquet files from hadoopish folder 【发布时间】:2017-05-21 10:56:10 【问题描述】:如果我在 Java 中以这种方式保存数据框,...:
df.write().parquet("myTest.parquet");
...,然后它以 hadoopish 方式保存(一个包含大量文件的文件夹)。
是否可以将数据框保存为单个文件?我试过collect()
,但没有用。
如果不可能,那么我的问题是我应该如何更改 Python 代码以从 df.write().parquet("myTest.parquet")
创建的 hadoopish 文件夹中读取 Parquet 文件:
load_df = sqlContext.read.parquet("myTest.parquet").where('field1="aaa"').select('field2', 'field3').coalesce(64)
【问题讨论】:
【参考方案1】:Spark 将您的文件写入一个目录,如您所说,该文件数量众多,如果写入操作成功,它会保存另一个名为 _SUCCESS
的空文件
我来自 scala,但我相信 python 中也有类似的方法
以parquet
或json
或任何您想要的格式直接保存和读取您的文件:
df.write.parquet("path")
loaddf = spark.read.parquet("path")
我尝试了 collect(),但没有帮助。
谈到collect
,在此类操作中使用它不是一个好习惯,因为它会将您的数据返回给驱动程序,因此您将失去并行计算的好处,如果数据可以,则会导致OutOfMemoryException
t适合内存
是否可以将数据框保存为单个文件?
在大多数情况下你真的不需要这样做,如果是这样,请在保存之前在你的Dataframe
上使用repartition(1)
方法
希望对你有帮助,最好的问候
【讨论】:
【参考方案2】:是否可以将数据框保存为单个文件?
是的,但是您不应该对单个 JVM 施加太大压力,这不仅会导致性能下降,还会导致 JVM 终止,从而导致整个 Spark 应用程序失败。
所以,是的,这是可能的,您应该 repartition(1)
拥有一个分区:
repartition(numPartitions: Int): Dataset[T] 返回一个新的 Dataset 正好有 numPartitions 个分区。
我应该如何更改 Python 代码以从 hadoopish 文件夹中读取 Parquet 文件
从所谓的“hadoopish”文件夹加载数据集根本不关心内部结构,而是将其视为单个文件(即隐藏的目录)。
这是文件存储方式的内部表示,不会影响加载它的代码。
【讨论】:
以上是关于如何从 hadoopish 文件夹加载镶木地板文件的主要内容,如果未能解决你的问题,请参考以下文章
如何将镶木地板文件从 s3 导入到 postgresql rds
如何使用 Spark 将镶木地板文件加载到 Hive 表中?
Pyspark:从不同的目录加载类似的镶木地板,并将文件夹名称作为一列组合成一个 DataFrame [重复]