如何从 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 中也有类似的方法

parquetjson 或任何您想要的格式直接保存和读取您的文件:

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 [重复]

无法从 S3 存储桶(镶木地板文件)将数据加载到 EMR 上的猪中

如何将带小数字段的镶木地板文件加载到BigQuery中?