Skip to content

Commit 9dfda70

Browse files
sbinetwesm
authored andcommitted
ARROW-3625: [Go] add examples for Record and Table
1 parent f2bf762 commit 9dfda70

File tree

3 files changed

+205
-0
lines changed

3 files changed

+205
-0
lines changed

go/arrow/array/table.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,32 @@ func NewTable(schema *arrow.Schema, cols []Column, rows int64) *simpleTable {
246246
return &tbl
247247
}
248248

249+
// NewTableFromRecords returns a new basic, non-lazy in-memory table.
250+
//
251+
// NewTableFromRecords panics if the records and schema are inconsistent.
252+
func NewTableFromRecords(schema *arrow.Schema, recs []Record) *simpleTable {
253+
arrs := make([]Interface, len(recs))
254+
cols := make([]Column, len(schema.Fields()))
255+
256+
defer func(cols []Column) {
257+
for i := range cols {
258+
cols[i].Release()
259+
}
260+
}(cols)
261+
262+
for i := range cols {
263+
field := schema.Field(i)
264+
for j, rec := range recs {
265+
arrs[j] = rec.Column(i)
266+
}
267+
chunk := NewChunked(field.Type, arrs)
268+
cols[i] = *NewColumn(field, chunk)
269+
chunk.Release()
270+
}
271+
272+
return NewTable(schema, cols, -1)
273+
}
274+
249275
func (tbl *simpleTable) Schema() *arrow.Schema { return tbl.schema }
250276
func (tbl *simpleTable) NumRows() int64 { return tbl.rows }
251277
func (tbl *simpleTable) NumCols() int64 { return int64(len(tbl.cols)) }

go/arrow/array/table_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,52 @@ func TestTable(t *testing.T) {
556556
}
557557
}
558558

559+
func TestTableFromRecords(t *testing.T) {
560+
mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
561+
defer mem.AssertSize(t, 0)
562+
563+
schema := arrow.NewSchema(
564+
[]arrow.Field{
565+
arrow.Field{Name: "f1-i32", Type: arrow.PrimitiveTypes.Int32},
566+
arrow.Field{Name: "f2-f64", Type: arrow.PrimitiveTypes.Float64},
567+
},
568+
nil,
569+
)
570+
571+
b := array.NewRecordBuilder(mem, schema)
572+
defer b.Release()
573+
574+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{1, 2, 3, 4, 5, 6}, nil)
575+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{7, 8, 9, 10}, []bool{true, true, false, true})
576+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, nil)
577+
578+
rec1 := b.NewRecord()
579+
defer rec1.Release()
580+
581+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
582+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
583+
584+
rec2 := b.NewRecord()
585+
defer rec2.Release()
586+
587+
tbl := array.NewTableFromRecords(schema, []array.Record{rec1, rec2})
588+
defer tbl.Release()
589+
590+
if got, want := tbl.Schema(), schema; !got.Equal(want) {
591+
t.Fatalf("invalid schema: got=%#v, want=%#v", got, want)
592+
}
593+
594+
if got, want := tbl.NumRows(), int64(20); got != want {
595+
t.Fatalf("invalid number of rows: got=%d, want=%d", got, want)
596+
}
597+
if got, want := tbl.NumCols(), int64(2); got != want {
598+
t.Fatalf("invalid number of columns: got=%d, want=%d", got, want)
599+
}
600+
if got, want := tbl.Column(0).Name(), schema.Field(0).Name; got != want {
601+
t.Fatalf("invalid column: got=%q, want=%q", got, want)
602+
}
603+
}
604+
559605
func TestTableReader(t *testing.T) {
560606
mem := memory.NewCheckedAllocator(memory.NewGoAllocator())
561607
defer mem.AssertSize(t, 0)

go/arrow/example_test.go

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package arrow_test
1818

1919
import (
2020
"fmt"
21+
"log"
2122

2223
"github.com/apache/arrow/go/arrow"
2324
"github.com/apache/arrow/go/arrow/array"
@@ -409,3 +410,135 @@ func Example_float64Tensor2x5ColMajor() {
409410
// arr[1 3] = 8
410411
// arr[1 4] = 10
411412
}
413+
414+
func Example_record() {
415+
pool := memory.NewGoAllocator()
416+
417+
schema := arrow.NewSchema(
418+
[]arrow.Field{
419+
arrow.Field{Name: "f1-i32", Type: arrow.PrimitiveTypes.Int32},
420+
arrow.Field{Name: "f2-f64", Type: arrow.PrimitiveTypes.Float64},
421+
},
422+
nil,
423+
)
424+
425+
b := array.NewRecordBuilder(pool, schema)
426+
defer b.Release()
427+
428+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{1, 2, 3, 4, 5, 6}, nil)
429+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{7, 8, 9, 10}, []bool{true, true, false, true})
430+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, nil)
431+
432+
rec := b.NewRecord()
433+
defer rec.Release()
434+
435+
for i, col := range rec.Columns() {
436+
fmt.Printf("column[%d] %q: %v\n", i, rec.ColumnName(i), col)
437+
}
438+
439+
// Output:
440+
// column[0] "f1-i32": [1 2 3 4 5 6 7 8 (null) 10]
441+
// column[1] "f2-f64": [1 2 3 4 5 6 7 8 9 10]
442+
}
443+
444+
func Example_recordReader() {
445+
pool := memory.NewGoAllocator()
446+
447+
schema := arrow.NewSchema(
448+
[]arrow.Field{
449+
arrow.Field{Name: "f1-i32", Type: arrow.PrimitiveTypes.Int32},
450+
arrow.Field{Name: "f2-f64", Type: arrow.PrimitiveTypes.Float64},
451+
},
452+
nil,
453+
)
454+
455+
b := array.NewRecordBuilder(pool, schema)
456+
defer b.Release()
457+
458+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{1, 2, 3, 4, 5, 6}, nil)
459+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{7, 8, 9, 10}, []bool{true, true, false, true})
460+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, nil)
461+
462+
rec1 := b.NewRecord()
463+
defer rec1.Release()
464+
465+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
466+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
467+
468+
rec2 := b.NewRecord()
469+
defer rec2.Release()
470+
471+
itr, err := array.NewRecordReader(schema, []array.Record{rec1, rec2})
472+
if err != nil {
473+
log.Fatal(err)
474+
}
475+
defer itr.Release()
476+
477+
n := 0
478+
for itr.Next() {
479+
rec := itr.Record()
480+
for i, col := range rec.Columns() {
481+
fmt.Printf("rec[%d][%q]: %v\n", n, rec.ColumnName(i), col)
482+
}
483+
n++
484+
}
485+
486+
// Output:
487+
// rec[0]["f1-i32"]: [1 2 3 4 5 6 7 8 (null) 10]
488+
// rec[0]["f2-f64"]: [1 2 3 4 5 6 7 8 9 10]
489+
// rec[1]["f1-i32"]: [11 12 13 14 15 16 17 18 19 20]
490+
// rec[1]["f2-f64"]: [11 12 13 14 15 16 17 18 19 20]
491+
}
492+
493+
func Example_table() {
494+
pool := memory.NewGoAllocator()
495+
496+
schema := arrow.NewSchema(
497+
[]arrow.Field{
498+
arrow.Field{Name: "f1-i32", Type: arrow.PrimitiveTypes.Int32},
499+
arrow.Field{Name: "f2-f64", Type: arrow.PrimitiveTypes.Float64},
500+
},
501+
nil,
502+
)
503+
504+
b := array.NewRecordBuilder(pool, schema)
505+
defer b.Release()
506+
507+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{1, 2, 3, 4, 5, 6}, nil)
508+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{7, 8, 9, 10}, []bool{true, true, false, true})
509+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, nil)
510+
511+
rec1 := b.NewRecord()
512+
defer rec1.Release()
513+
514+
b.Field(0).(*array.Int32Builder).AppendValues([]int32{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
515+
b.Field(1).(*array.Float64Builder).AppendValues([]float64{11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, nil)
516+
517+
rec2 := b.NewRecord()
518+
defer rec2.Release()
519+
520+
tbl := array.NewTableFromRecords(schema, []array.Record{rec1, rec2})
521+
defer tbl.Release()
522+
523+
tr := array.NewTableReader(tbl, 5)
524+
defer tr.Release()
525+
526+
n := 0
527+
for tr.Next() {
528+
rec := tr.Record()
529+
for i, col := range rec.Columns() {
530+
fmt.Printf("rec[%d][%q]: %v\n", n, rec.ColumnName(i), col)
531+
}
532+
n++
533+
}
534+
535+
// Output:
536+
// rec[0]["f1-i32"]: [1 2 3 4 5]
537+
// rec[0]["f2-f64"]: [1 2 3 4 5]
538+
// rec[1]["f1-i32"]: [6 7 8 (null) 10]
539+
// rec[1]["f2-f64"]: [6 7 8 9 10]
540+
// rec[2]["f1-i32"]: [11 12 13 14 15]
541+
// rec[2]["f2-f64"]: [11 12 13 14 15]
542+
// rec[3]["f1-i32"]: [16 17 18 19 20]
543+
// rec[3]["f2-f64"]: [16 17 18 19 20]
544+
}

0 commit comments

Comments
 (0)