【问题标题】:Are Apache Spark 2.0 parquet files incompatible with Apache Arrow?Apache Spark 2.0 parquet 文件是否与 Apache Arrow 不兼容?
【发布时间】:2020-07-28 18:57:58
【问题描述】:

问题

我已经为 Python 环境中的深度学习应用程序编写了一个 Apache Spark DataFrame 作为 parquet 文件;我目前在实现 petastorm(遵循this notebook)和horovod 框架的基本示例时遇到问题,即在读取上述文件时。 DataFrame 具有以下类型:DataFrame[features: array<float>, next: int, weight: int](很像在 DataBricks 的笔记本中,我有 features 是一个 VectorUDT,我将它转换为一个数组)。
在这两种情况下,Apache Arrow 都会引发 ArrowIOError : Invalid parquet file. Corrupt footer. 错误。

到目前为止我发现了什么

我在this questionthis 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

【问题讨论】:

  • 这听起来像是在文件文件夹中由 Spark 生成的文件实际上不是 Parquet,应该被 Apache Arrow 忽略。你能看看那个文件夹,看看有没有?目前,只有_SUCCESS 文件被忽略,所有其他文件都应该是 Parquet 文件。
  • @UweL.Korn 实际上,我将下划线文件添加到忽略文件列表中,就像在 petastorm 示例笔记本中一样。
  • @al.one 你使用的是什么版本的 pyarrow?笔记本(issues.apache.org/jira/browse/ARROW-4723)中链接的下划线问题应该已经在 pyarrow 0.14 中解决了
  • @joris 我使用的是在我的 databricks 运行时环境中提供的 0.13 版 - 我安装了 0.14 版,它就像一个魅力。谢谢。

标签: python-3.x apache-spark parquet databricks pyarrow


【解决方案1】:

问题已在 pyarrow 0.14+ (issues.apache.org/jira/browse/ARROW-4723) 中解决,请务必使用 pip 安装更新版本(直到 Databricks Runtime 6.5,包含的版本为 0.13)。
感谢@joris'评论指出这一点。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2017-06-04
    • 2019-09-20
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多