如何本地读取羽毛/箭头文件



我有羽毛格式文件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

我不想用panda来加载数据,因为它为我的19GB羽毛文件(从45GB csv创建(设置了segfault。

丑陋的黑客-使用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中使用零复制的memmap值!yahoo!(

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

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

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

从pyspark导入SparkContext

sc = SparkContext("local", "App Name")
sql = SQLContext(sc)

然后使用createDataFrame,如下所示:

spark_df = sql.createDataFrame(pandas_df)

最新更新