Как реализовать пример бумаги Dremel в пирору? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь использовать следующую примерную схему документа из бумаги Dremel Dremel: интерактивный анализ наборов данных веб-масштаба :

message Document {
  required int64 DocId;
  optional group Links {
    repeated int64 Backward;
    repeated int64 Forward; 
  }
  repeated group Name {
    repeated group Language {
      required string Code;
      optional string Country; 
    }
    optional string Url; 
  }
}

для сохранения документа в формате файла Apache Parquet с использованиемpyarrow.Я пытаюсь реализовать следующее:

import pyarrow as pa
import pyarrow.parquet as pq

links_type = pa.struct([
    pa.field("backward", pa.list_(pa.int64())),
    pa.field("forward", pa.list_(pa.int64())),
])

language_type = pa.struct([
    pa.field("code", pa.string(), nullable=False),
    pa.field("country", pa.string())
])

names_type = pa.struct([
    pa.field("language", pa.list_(language_type)),
    pa.field("url", pa.string()),
])

document_type = pa.struct([
    pa.field("doc_id", pa.int64(), nullable=False),
    pa.field("links", links_type, nullable=True),
    pa.field("name", pa.list_(names_type))
])

r1 = {
    "doc_id": 10,
    "links": {
        "forward": [20, 40, 60]
    },
    "name": [
        {
            "language": [
                {
                    "code": "en_us",
                    "country": "us"
                },
                {
                    "code": "en"
                }
            ],
            "url": "http://A"
        },
        {
            "url": "http://B"
        },
        {
            "language": [
                {
                    "code": "en-gb",
                    "country": "gb"
                }
            ]
        }
    ]
}

r2 = {
    "doc_id": 20,
    "links": {
        "forward": [80],
        "backward": [10, 30],
    },
    "name": [
        {
            "url": "http://C"
        }
    ]
}

records = pa.array([r1,r2], document_type)
batch = pa.RecordBatch.from_arrays([records], names=["documents"])
table = pa.Table.from_batches([batch])

pq.write_table(table, "dremel_pyarrow.parquet")

Но эта программа заканчивается исключением из-за pq.write_table(table, "dremel_pyarrow.parquet") и ошибки сегментации:

    self.writer.write_table(table, row_group_size=row_group_size)
  File "pyarrow/_parquet.pyx", line 934, in pyarrow._parquet.ParquetWriter.write_table
  File "pyarrow/error.pxi", line 81, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Nested column branch had multiple children
Segmentation fault (core dumped)

Поэтому мне любопытно, можно ли воспроизвестиПример бумаги дремеля в пиарроу?

...