我目前正在编写一些代码来将任意数据结构转换为 Apache Arrow 向量,但陷入了一些相对简单的问题,即如何将 abyte[]写入ListVector.
ListVector当通过 a向 a 写入数据时BaseWriter.ListWriter,可以非常轻松地添加原始类型 \xe2\x80\x93 即,writer.integer().writeInt(i)或writer.float4().writeFloat4(f)。
然而,对于像字节(或字符串)这样的可变长度类型,只剩下具有类似于以下签名的方法:
\n\npublic void write(VarBinaryHolder h);\n\npublic void writeVarBinary(int start, int end, ArrowBuf buffer);\nRun Code Online (Sandbox Code Playgroud)\n\n作为VarBinaryHolder一个简单生成的包装类,ArrowBuf甚至没有构造函数。
我期待与VarBinaryVector提供的内容类似的东西,它有一个Mutator完全setSafe(int index, byte[] bytes)符合预期的方法。
此外,似乎没有直接的方法将字节数组包装到 an 中ArrowBuf,我看到的唯一方法是将数据写入新的VarBinaryVector并随后获取底层ArrowBuf。
所以,我的审讯是:
\n\n1 A …
我有一个有点大(~20 GB)分区数据集的镶木地板格式.我想从数据集中读取特定分区pyarrow.我以为我可以用这个完成这个pyarrow.parquet.ParquetDataset,但事实似乎并非如此.这是一个小例子来说明我想要的东西.
要创建随机数据集:
from collections import OrderedDict
from itertools import product, chain
from uuid import uuid4
import os
from glob import glob
import numpy as np
import pandas as pd
import pyarrow as pa
from pyarrow.parquet import ParquetWriter, ParquetDataset
def get_partitions(basepath, partitions):
"""Generate directory hierarchy for a paritioned dataset
data
??? part1=foo
? ??? part2=True
??? part1=foo
? ??? part2=False
??? part1=bar
? ??? part2=True
??? part1=bar
??? part2=False
"""
path_tmpl = '/'.join(['{}={}'] * len(partitions)) # …Run Code Online (Sandbox Code Playgroud) 我有一个通过读取文件创建的 Apache 箭头数组。
std::shared_ptr<arrow::Array> array;
PARQUET_THROW_NOT_OK(reader->ReadColumn(0, &array));
Run Code Online (Sandbox Code Playgroud)
有没有办法将其转换为 std::vector 或 C++ 中的任何其他本机数组类型?
我正在使用Apache Arrow进行非常基本的实验,主要是关于使用 Arrow 的 IPC 格式(到文件)、Parquet 格式(到文件)和 IPC 格式(通过 JNI 流)在 Java、C++、Python 之间传递一些数据。
C++ 和 Python 看起来有些用处,但 Java 部分确实让我感到困扰。
可悲的是,Java 文档有点有限,但尽管承认这些隐藏文档(不是 TOC 的一部分)的警告,我只是想VectorSchemaRoot从以前编写的文件中填充一些。
忽略 99% 的实验代码,以下最小示例显示了我的问题,我只是创建一些数据,将其写出(可以很好地在 Python 中导入)并尝试用 Java 读回。
但是数据所有权似乎妨碍了我想要实现的目标。
也许保留VectorSchemaRoot作为核心条目的想法(例如:我的所有数据都在这里)是某种错误的用法,但我不确定有什么替代方法。为什么我要手动保留IntVectors和合作。当这个类会做同样的事情并提供一些 API 来使用它时。
package arrow.test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.arrow.memory.RootAllocator;
import org.apache.arrow.vector.BitVector;
import org.apache.arrow.vector.FieldVector;
import org.apache.arrow.vector.IntVector;
import org.apache.arrow.vector.VectorSchemaRoot;
import org.apache.arrow.vector.ipc.ArrowFileReader;
import org.apache.arrow.vector.ipc.ArrowFileWriter;
import org.apache.arrow.vector.types.pojo.ArrowType;
import org.apache.arrow.vector.types.pojo.Field;
import org.apache.arrow.vector.types.pojo.FieldType;
import org.apache.arrow.vector.types.pojo.Schema;
import com.google.common.collect.ImmutableList;
public …Run Code Online (Sandbox Code Playgroud) 我一直在使用支持直接从 AWS S3 读取和写入的最新R arrow包 ( arrow_2.0.0.20201106)(这很棒)。
我在编写和读取自己的文件时似乎没有问题(见下文):
write_parquet(iris, "iris.parquet")
system("aws s3 mv iris.parquet s3://myawsbucket/iris.parquet")
df <- read_parquet("s3://myawsbucket/iris.parquet")
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试读取其中一个示例R arrow文件时,出现以下错误:
df <- read_parquet("s3://ursa-labs-taxi-data/2019/06/data.parquet")
Error in parquet___arrow___FileReader__ReadTable1(self) :
IOError: NotImplemented: Support for codec 'snappy' not built
Run Code Online (Sandbox Code Playgroud)
当我检查编解码器是否可用时,它看起来不是:
codec_is_available(type="snappy")
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
任何人都知道一种使“活泼”编解码器可用的方法?
谢谢,迈克
############
感谢下面@Neal 的回答。这是为我安装所有需要的依赖项的代码。
Sys.setenv(ARROW_S3="ON")
Sys.setenv(NOT_CRAN="true")
install.packages("arrow", repos = "https://arrow-r-nightly.s3.amazonaws.com")
Run Code Online (Sandbox Code Playgroud) 我遇到了越来越多的情况,需要在 R 中使用内存不足 (OOM) 方法进行数据分析。我熟悉其他 OOM 方法,例如sparklyr和 ,DBI但我最近遇到arrow并希望对其进行更多探索。
问题是我通常使用的平面文件足够大,如果没有帮助,它们无法读入 R。因此,我理想情况下更喜欢一种无需首先将数据集读入 R 即可进行转换的方法。
您能提供的任何帮助将不胜感激!
我知道“许多 Arrow 对象是不可变的:一旦构造,它们的逻辑属性就不能再改变”(文档)。在《绿箭侠》创作者之一的这篇博文中,据说
Arrow C++ 中的表列可以分块,因此附加到表是零复制操作,不需要重要的计算或内存分配。
但是,我无法在文档中找到如何将行追加到表中。pyarrow.concat_tables(tables, promote=False)做了类似的事情,但据我了解,它会生成一个新的 Table 对象,而不是向现有对象添加块。
我不确定这个操作是否完全可能/有意义(在这种情况下我想知道如何进行)或者是否不可行(在这种情况下,pyarrow.concat_tables这正是我所需要的)。
类似问题:
Table物体。可能来自read_csv操作或手动构建。我开始使用镶木地板文件格式。Apache 官方网站建议使用 512MB 到 1GB 的大行组(此处)。一些在线资源(例如这个)建议默认行组大小为 128MB。
我有大量 parquet 文件,稍后我将使用 AWS Glue 上的 PySpark 在下游处理这些文件。这些文件具有非常小的行组。我无法控制我开始使用的文件,但想要组合行组,以便在下游处理之前获得“更高效”的文件(为什么?这些文件将上传到 S3 并使用 Spark 进行处理;我的理解是Spark 一次会读取一个行组,因此更多较小的行组会导致 IO 操作增加,效率低下;如果此假设无效,请赐教)。
对于这个问题,我们只考虑其中一个文件。它经过压缩(经过snappy压缩),在磁盘上的大小为 85MB。当我使用该pqrs工具检查其架构时,它报告该文件在 1,115 个行组中有 55,733 条记录,每个行组似乎约为 500 kB - 具体来说,如下所示:
row group 7:
--------------------------------------------------------------------------------
total byte size: 424752
num of rows: 50
Run Code Online (Sandbox Code Playgroud)
如果我简单地采用(1115 个行组 * 500 kB/行组),则大约为 500MB;而磁盘上的文件为 85MB。诚然,有些行组小于 500kB,但我观察了大约 100 个行组(一半在顶部,一半在底部),它们都在大致范围内。
子问题 1: 差异是多少(计算值 500MB 与实际值 85MB),因为报告的行组大小实际上pqrs代表未压缩的大小,也许行组的内存大小是多少(大概会大于磁盘上的压缩序列化大小)?换句话说,我不能做一个简单的 1115 * 500 但必须应用某种压缩因子?
子问题2: 当我看到建议的批量大小是128MB时,这到底是什么意思?未压缩的内存大小?磁盘上的序列化压缩大小?还有别的事吗?它与 所报道的内容有什么关系pqrs …
是否有一种与语言无关的方式以类似于 Avro 的方式表示 Parquet 或 Arrow 模式?例如,Avro 架构可能如下所示:
\n{\n "type": "record",\n "namespace": "com.example",\n "name": "FullName",\n "fields": [\n { "name": "first", "type": "string" },\n { "name": "last", "type": "string" }\n ]\n} \nRun Code Online (Sandbox Code Playgroud)\nParquet 和/或 Arrow 有类似的东西吗?
\n(我\xe2\x80\x99d将其写为2个单独的问题,但Stack Overflow将它们标记为骗局,抱歉)。
\n安装的软件包不支持R:arrowinstall.packages('arrow')lz4
codec_is_available('lz4')\n# [1] FALSE\nRun Code Online (Sandbox Code Playgroud)\n软件包版本为:
\npackageVersion('arrow')\n# [1] \xe2\x80\x980.17.1\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n这是在 Ubuntu 20.04 上。
\n我如何获得支持R arrow包lz4?