提问者:小点点

如何原生读取羽毛/箭头文件?


我有羽毛格式文件sales. feather用于在python和R之间交换数据。

在R中,我使用以下命令:

df = arrow::read_feather("sales.feather", as_data_frame=TRUE)

在python中,我使用了它:

df = pandas.read_feather("sales.feather")

将数据从该文件加载到内存到从pyspark操作的Spark实例中的最佳方法是什么?我还想控制pyspark. StorageLevel从feather读取的数据。

我不想使用熊猫来加载数据,因为它对我的19GB羽毛文件进行分段,该文件是从45GB csv创建的。


共3个答案

匿名用户

丑陋的黑客-使用mapInArrow。

import pyarrow as pa


def read_arrow(spark, filename, schema=None):

    def mapper(iterator):
        with pa.memory_map(filename, "rb") as source:
            f = pa.ipc.open_file(source)
            for batch in iterator:
                for i in batch['id']:
                    yield f.get_batch(i.as_py())

    tmp_reader = pa.ipc.open_file(filename)
    num_batches = tmp_reader.num_record_batches
    if schema is None:
        # read first batch and convert just one row to pandas
        tmp_row = tmp_reader.get_batch(0)[:1]
        schema = spark.createDataFrame(tmp_row.to_pandas()).schema
    return spark.range(num_batches).mapInArrow(mapper, schema)


df = read_arrow(spark, "some-data.arrow")
df.show()

(奖励:在Spark! yahoo!中使用零复制的memmap值!)

匿名用户

也许您可以考虑切换到镶木地板格式?看起来更适合您的用途,请参阅羽毛和镶木地板有什么区别?

匿名用户

您可以将熊猫数据帧转换为Spark数据帧,如下所示。

from pyspark.sql import SQLContext, Row
sqlContext = SQLContext(sc)
spark_df = sqlContext.createDataFrame(pandas_df)