11

我在 Python 中使用 Apache Arrow 和 Spark 已经有一段时间了,并且通过使用 Pandas 作为中介可以轻松地在数据帧和 Arrow 对象之间进行转换。

然而,最近,我已经从 Python 迁移到 Scala 以与 Spark 交互,并且使用 Arrow 在 Scala (Java) 中不像在 Python 中那样直观。我的基本需求是尽快将 Spark 数据帧(或 RDD,因为它们很容易转换)转换为 Arrow 对象。我最初的想法是先转换为 Parquet,然后从 Parquet 转到 Arrow,因为我记得 pyarrow 可以从 Parquet 读取。但是,如果我错了,请纠正我,在查看 Arrow Java 文档一段时间后,我找不到 Parquet to Arrow 函数。Java版没有这个功能吗?是否有另一种方法可以将 Spark 数据帧获取到 Arrow 对象?也许将数据框的列转换为数组然后转换为箭头对象?

任何帮助将非常感激。谢谢

编辑:找到将镶木地板模式转换为箭头模式的以下链接。但它似乎没有像我需要的那样从镶木地板文件返回箭头对象: https ://github.com/apache/parquet-mr/blob/70f28810a5547219e18ffc3465f519c454fee6e5/parquet-arrow/src/main/java/org/apache /parquet/arrow/schema/SchemaConverter.java

4

4 回答 4

5

尚无 Parquet <-> Arrow 转换器可用作 Java 中的库。你可以看看 Dremio 中基于 Arrow 的 Parquet 转换器(https://github.com/dremio/dremio-oss/tree/master/sabot/kernel/src/main/java/com/dremio/exec/store /parquet ) 的灵感。我相信 Apache Parquet 项目会欢迎您为实现此功能做出贡献。

我们在 C++ 实现中为 Parquet 开发了 Arrow 阅读器/编写器:https ://github.com/apache/parquet-cpp/tree/master/src/parquet/arrow 。嵌套数据支持尚未完成,但在接下来的 6 到 12 个月内应该会更加完整(随着贡献者的增加而更快)。

于 2017-08-11T14:37:05.707 回答
3

现在有了答案,Arrow 可用于将 Spark DataFrames 转换为 Pandas DataFrames 或在调用 Pandas UDFs 时。请参阅SQL PySpark Pandas with Arrow文档页面。

于 2020-05-30T22:31:26.000 回答
1

Spark 3.3 将有mapInArrowAPI 调用,类似于已经存在的mapInPandasAPI 调用。

这是第一个将其添加到 Python 的 PR - https://github.com/apache/spark/pull/34505

到 3.3 版本时,还会有另一个类似的 Spark Scala API 调用。

不确定您的用例到底是什么,但这似乎可能会有所帮助。

PS。请注意,最初此 API 计划为开发人员级别,因为使用 Arrow 一开始可能对用户不太友好。如果您在 Spark/Arrow 之上开发一个库,这可能会很棒,例如,当您可以抽象出其中一些 Arrow 细微差别时。

于 2021-11-28T05:11:51.423 回答
-1

Apache Arrow 是一个跨语言开发平台,支持内存中的列式数据结构。由于它是跨语言平台,它有助于用不同的编程语言编写,例如 Python、Java、C、C++、C#、Go、R、Ruby、JavaScript、MATLAB、Rust。

由于它支持 Java,它还支持 Scala 语言,因为它们都运行在 jvm 之上。但是要让 Scala 功能将 Scala 对象转换为 Arrow 对象,它必须通过 python,因为 Arrow 是用 python 编写的,并且它广泛支持 python。

最终,Python 与 Scala 对话,并为它带来了随时可用的 jvm 属性。

请通过以下链接查看详细说明: https ://databricks.com/session/accelerating-tensorflow-with-apache-arrow-on-spark-bonus-making-it-available-in-scala

于 2019-03-20T07:41:11.560 回答