python-3.x - Apache Spark 2.0 parquet 文件是否与 Apache Arrow 不兼容?
问题描述
问题
我已经为 Python 环境中的深度学习应用程序编写了一个 Apache Spark DataFrame 作为 parquet 文件;我目前在实现 petastorm (遵循本笔记本)和horovod框架的基本示例时遇到问题,即在阅读上述文件时。DataFrame 具有以下类型:(DataFrame[features: array<float>, next: int, weight: int]
很像在 DataBricks 的笔记本中,我曾经features
是一个 VectorUDT,我将其转换为一个数组)。
在这两种情况下,Apache Arrow 都会引发ArrowIOError : Invalid parquet file. Corrupt footer.
错误。
到现在为止我发现的
我在这个问题和这个 PR中发现,从 2.0 版开始,Spark 不会写入_metadata
文件_common_metadata
,除非在 Spark 的配置spark.hadoop.parquet.enable.summary-metadata
中设置为;true
这些文件确实丢失了。
因此,我尝试用这种环境重写我的 DataFrame,仍然没有_common_metadata
文件。同样有效的方法是在构造读取器时将模式显式传递给 petastorm(例如传递schema_fields
给make_batch_reader
;这是 horovod 的一个问题,因为 的构造函数中没有这样的参数horovod.spark.keras.KerasEstimator
)。
如果可能的话,我如何能够让 Spark 输出这些文件,或者在 Arrow 中推断架构,就像 Spark 似乎正在做的那样?
horovod 的最小示例
# Saving df
print(spark.config.get('spark.hadoop.parquet.enable.summary-metadata')) # outputs 'true'
df.repartition(10).write.mode('overwrite').parquet(path)
# ...
# Training
import horovod.spark.keras as hvd
from horovod.spark.common.store import Store
model = build_model()
opti = Adadelta(learning_rate=0.015)
loss='sparse_categorical_crossentropy'
store = Store().create(prefix_path=prefix_path,
train_path=train_path,
val_path=val_path)
keras_estimator = hvd.KerasEstimator(
num_proc=16,
store=store,
model=model,
optimizer=opti,
loss=loss,
feature_cols=['features'],
label_cols=['next'],
batch_size=auto_steps_per_epoch,
epochs=auto_nb_epochs,
sample_weight_col='weight'
)
keras_model = keras_estimator.fit_on_parquet() # Fails here with ArrowIOError
解决方案
该问题已在 pyarrow 0.14+ ( issues.apache.org/jira/browse/ARROW-4723 ) 中解决,请务必使用 pip 安装更新版本(直到 Databricks Runtime 6.5,包含的版本为 0.13)。
感谢@joris的评论指出了这一点。
推荐阅读
- android - 只能通过 recyclerview 检索 firebase 中的最后一个数据集
- reactjs - 如何在 reacthook 和 redux 中只获取一次数据并且不再获取
- selenium - Selenide PDF 下载无法下载文件:代理服务器未启动
- gitlab - Gitlab:如何批准我自己的合并请求
- javascript - 为嵌套的 for 循环创建一个函数
- javascript - ajax 函数在不应该时仍然刷新页面
- reactjs - 如何将模拟对象传递给酶模拟功能?
- python - 销毁所有子窗口
- regex - 找出正则表达式中的最后一个数字
- visual-studio-code - 在 Visual Studio Code 中绘制箭头和符号