Maison >développement back-end >Golang >Construisez le schéma en utilisant les types de données spécifiés dans datatype.go implémenté par golang apache arrow

Construisez le schéma en utilisant les types de données spécifiés dans datatype.go implémenté par golang apache arrow

WBOY
WBOYavant
2024-02-06 08:36:07536parcourir

使用golang apache arrow实现的datatype.go中指定的数据类型来构建模式

Contenu de la question

J'apprends Apache Arrow et j'aimerais en savoir plus sur la façon de créer des enregistrements de schéma et de flèche. J'ai référencé certains matériaux pour cela, mais jusqu'à présent, tous utilisent simplement des types primitifs pour créer des modèles comme celui-ci : `

schema := arrow.NewSchema(
    []arrow.Field{
        {Name: "f1-i32", Type: arrow.PrimitiveTypes.Int32},
        {Name: "f2-f64", Type: arrow.PrimitiveTypes.Float64},
    },
    nil,
)

Certains types de données n'existent pas dans les types primitifs que je souhaite utiliser. Par exemple, je souhaite utiliser bool ou decimal128. Je regardais la bibliothèque golang arrow et j'ai trouvé le fichier datatype.go qui contient tous les types de données possibles que je souhaite utiliser. Mais le type ici n'est pas le type datatype requis lors de la construction du modèle.

Donc, j'ai les trois questions suivantes :

  1. Si possible, comment puis-je créer mon schéma en utilisant ces types de données dans datatype.go ?
  2. Si je souhaite utiliser le type décimal, comment puis-je spécifier la précision et le nombre de décimales ?
  3. Exemple d'utilisation de types étendus.

Réponse correcte


Ces types de données nommés constantes définis dans datatype.go 中定义的这些数据类型命名常量已用于创建您想要的新类型的一部分。其中一些是 type decimal128type structtype booleantype struct 如果您检查这些结构的 id 方法的源代码,它们返回在 datatype.go 中定义的常量,其名称与结构的名称相似。这些结构已经实现了 datatype 接口,这意味着您可以将它们分配给 arrow.field.type 因为该字段的类型是 datatype ont été utilisés dans le cadre de la création du nouveau type souhaité. Certains d'entre eux sont
et
Si vous vérifiez le code source des méthodes id de ces structures, elles renvoient des constantes définies dans bool 中定义的常量 datatype.godatatype_fixedwidth.go 中用作 type booleantype structid avec des noms similaires aux noms des structures. Ces structures implémentent déjà l'interface
, ce qui signifie que vous pouvez les attribuer à arrow.field.type car le type du champ est func (t *booleantype) id() 类型 { return bool }.
Ce que je veux dire pour eux, c'est : type decimal128type struct La constante
définie dans bool est utilisée dans datatype_fixedwidth.go comme valeur de retour de la méthode id de func (*decimal128type) id() 类型 { return decimal128 }.

datatype La même chose s'applique à

.

type decimal128type struct.
datatypeLes méthodes sur l'une de ces structures montrent qu'elles implémentent l'interface

 :

func (*decimal128type) bitwidth() int
func (t *decimal128type) fingerprint() string
func (*decimal128type) id() type
func (*decimal128type) name() string
func (t *decimal128type) string() string
type booleantype structCes méthodes conviennent aux

.

Et la définition de typeinterface :

type datatype interface {
    id() type
    // name is name of the data type.
    name() string
    fingerprint() string
}

y est parvenu aussi.

Vous pouvez donc les utiliser pour

champs :

type field struct {
    name     string   // field name
    type     datatype // the field's data type
    nullable bool     // fields can be nullable
    metadata metadata // the field's metadata, if any
}
Exemple démonstratif :
package main

import (
    "fmt"

    "github.com/apache/arrow/go/arrow"
)

func main() {
    booltype :=  &arrow.booleantype{}
    decimal128type := &arrow.decimal128type{precision: 1, scale: 1}

    schema := arrow.newschema(
        []arrow.field{
            {name: "f1-bool", type: booltype},
            {name: "f2-decimal128", type: decimal128type},
        },
        nil,
    )

    fmt.println(schema)
}

Sortie :

schema:
  fields: 2
    - f1-bool: type=bool
    - f2-decimal128: type=decimal(1, 1)
🎜Vous pouvez le trouver dans 🎜Documents🎜. 🎜 Il y a aussi quelque chose lié aux types d'extensions. 🎜 Mais je ne suis pas familier avec les types d’extensions, je ne peux donc pas en montrer un exemple. Mais si vous le connaissez, vous pouvez le résoudre facilement. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer