Tipos de dados
Nesta página
O PyMongoArrow suporta a maioria dos BSON types. Como Arrow ePolars fornecem suporte de primeira classe para Listas e Estruturas, isso inclui matrizes e documentos incorporados.
O suporte para tipos adicionais será adicionado em versões subsequentes.
Dica
Para obter mais informações sobre BSON types os tipos de BSON, consulte a BSON especificação de BSON.
Tipo de JSON | Identificadores de tipo |
---|---|
String | py.str , uma instância de pyarrow.string |
documento incorporado | py.dict , e instância de pyarrow.struct |
Array incorporada | Uma instância de pyarrow.list_ |
ObjectId | py.bytes , bson.ObjectId , uma instância de pymongoarrow.types.ObjectIdType , uma instância de pymongoarrow.pandas_types.PandasObjectId |
Decimal128 | bson.Decimal128 , uma instância de pymongoarrow.types.Decimal128Type , uma instância de pymongoarrow.pandas_types.PandasDecimal128 |
Boolean | Uma instância de ~pyarrow.bool_ , ~py.bool |
Ponto flutuante binário de 64 bits | py.float , uma instância de pyarrow.float64 |
Inteiro de bits | Uma instância de pyarrow.int32 |
Inteiro de 64 bits | ~py.int , bson.int64.Int64 , uma instância de pyarrow.int64 |
Data hora UTC | Uma instância de ~pyarrow.timestamp com resolução ms , py.datetime.datetime |
Dados binários | bson.Binary , uma instância de pymongoarrow.types.BinaryType , uma instância de pymongoarrow.pandas_types.PandasBinary . |
Código JavaScript | bson.Code , uma instância de pymongoarrow.types.CodeType , uma instância de pymongoarrow.pandas_types.PandasCode |
Observação
O PyMongoArow suporta Decimal128
apenas em sistemas little-endian. Em sistemas big-endian, ele usa null
em vez disso.
Utilize identificadores de tipo para especificar que um campo é de um determinado tipo durante a declaração pymongoarrow.api.Schema
. Por exemplo, se seus dados tiverem campos f1
e f2
tipos de suporte inteiro de 32 bits e data/hora UTC, e um _id
que é um ObjectId
, você poderá definir seu esquema da seguinte maneira:
schema = Schema({ '_id': ObjectId, 'f1': pyarrow.int32(), 'f2': pyarrow.timestamp('ms') })
Tipos de dados não suportados em um esquema causam um ValueError
identificando o campo e seu tipo de dados.
Considerações sobre arrays incorporadas
O esquema utilizado para uma array incorporada deve utilizar o tipo pyarrow.list_()
, para especificar o tipo dos elementos da array. Por exemplo,
from pyarrow import list_, float64 schema = Schema({'_id': ObjectId, 'location': {'coordinates': list_(float64())} })
Tipos de extensão
O PyMongoArrow implementa os tipos ObjectId
, Decimal128
, Binary data
e JavaScript code
como tipos de extensão para PyArrow e Pandas. Para tabelas de setas, os valores desses tipos têm o tipo de extensão pymongoarrow
apropriado, como pymongoarrow.types.ObjectIdType
. Você pode obter o objeto Python bson
apropriado usando o método .as_py()
ou chamando .to_pylist()
na tabela.
from pymongo import MongoClient from bson import ObjectId from pymongoarrow.api import find_arrow_all client = MongoClient() coll = client.test.test"_id": ObjectId(), "foo": 100}, {"_id": ObjectId(), "foo": 200}]) coll.insert_many([{<pymongo.results.InsertManyResult at 0x1080a72b0> table = find_arrow_all(coll, {}) tablepyarrow.Table _id: extension<arrow.py_extension_type<ObjectIdType>> foo: int32 ---- _id: [[64408B0D5AC9E208AF220142,64408B0D5AC9E208AF220143]] foo: [[100,200]] "_id"][0] table[<pyarrow.ObjectIdScalar: ObjectId('64408b0d5ac9e208af220142')> "_id"][0].as_py() table[ObjectId('64408b0d5ac9e208af220142') table.to_pylist()[{'_id': ObjectId('64408b0d5ac9e208af220142'), 'foo': 100}, {'_id': ObjectId('64408b0d5ac9e208af220143'), 'foo': 200}]
Ao converter parapandas, as colunas do tipo de extensão têm um tipo de extensão pymongoarrow
apropriado, como pymongoarrow.pandas_types.PandasDecimal128
. O valor do elemento no dataframe é o tipo bson
apropriado.
from pymongo import MongoClient from bson import Decimal128 from pymongoarrow.api import find_pandas_all client = MongoClient() coll = client.test.test"foo": Decimal128("0.1")}, {"foo": Decimal128("0.1")}]) coll.insert_many([{<pymongo.results.InsertManyResult at 0x1080a72b0> df = find_pandas_all(coll, {}) df _id foo 0 64408bf65ac9e208af220144 0.1 1 64408bf65ac9e208af220145 0.1 "foo"].dtype df[<pymongoarrow.pandas_types.PandasDecimal128 at 0x11fe0ae90> "foo"][0] df[Decimal128('0.1') "_id"][0] df[ObjectId('64408bf65ac9e208af220144')
O Apollos não suporta Tipos de Extensão.
Valores nulos e conversão para DataFrames Pandas
Em Seta e Áries, todas as Matrizes são anuláveis. O Pandas tem tipos de dados experimentais anuláveis, como Int64
. Você pode instruir a Arrow a criar um DataFrame de Pandas usando dtypes anuláveis com o seguinte código de documentação do Apache.
>>> dtype_mapping = { ... pa.int8(): pd.Int8Dtype(), ... pa.int16(): pd.Int16Dtype(), ... pa.int32(): pd.Int32Dtype(), ... pa.int64(): pd.Int64Dtype(), ... pa.uint8(): pd.UInt8Dtype(), ... pa.uint16(): pd.UInt16Dtype(), ... pa.uint32(): pd.UInt32Dtype(), ... pa.uint64(): pd.UInt64Dtype(), ... pa.bool_(): pd.BooleanDtype(), ... pa.float32(): pd.Float32Dtype(), ... pa.float64(): pd.Float64Dtype(), ... pa.string(): pd.StringDtype(), ... } ... df = arrow_table.to_pandas( ... types_mapper=dtype_mapping.get, split_blocks=True, self_destruct=True ... ) ... del arrow_table
Definir uma conversão para pa.string()
também converte strings de Arrow em strings NumPy, e não objetos.
Tipos de extensão aninhadas
seta pendente-179, os tipos de extensão, como ObjectId
, que aparecem em documentos aninhados não são convertidos para o tipo de extensão PyMongoArrow correspondente , mas têm o tipo bruto de Arrow, FixedSizeBinaryType(fixed_size_binary[12])
.
Estes valores podem ser consumidos como estão ou convertidos individualmente para o tipo de extensão desejado, como _id = out['nested'][0]['_id'].cast(ObjectIdType())
.