View a markdown version of this page

Esempi di interrogazione con parquet - Amazon Neptune

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esempi di interrogazione con parquet

La seguente query di esempio restituisce il numero di righe in un determinato file Parquet:

CALL neptune.read( { source: "<s3 path>", format: "parquet" } ) YIELD row RETURN count(row)

È possibile eseguire l'esempio di query utilizzando l'execute-open-cypher-queryoperazione in AWS CLI eseguendo il codice seguente:

aws neptunedata execute-open-cypher-query \ --open-cypher-query "CALL neptune.read({source: '<s3 path>', format: 'parquet'}) YIELD row RETURN count(row)" \ --endpoint-url https://my-cluster-name.cluster-abcdefgh1234.us-east-1.neptune.amazonaws.com:8182

Una query può essere flessibile in quanto utilizza le righe lette da un file Parquet. Ad esempio, la seguente query crea un nodo con un campo impostato sui dati trovati nel file Parquet:

CALL neptune.read( { source: "<s3 path>", format: "parquet" } ) YIELD row CREATE (n {someField: row.someCol}) RETURN n
avvertimento

Non è considerata una buona pratica utilizzare una clausola di grandi dimensioni che produce risultati come MATCH(n) prima di una clausola. CALL Ciò comporterebbe una query di lunga durata, a causa dell'incrocio tra le soluzioni in arrivo dalle clausole precedenti e le righe lette da neptune.read. Si consiglia di avviare la query con neptune.read. CALL

Tipi di colonne Parquet supportati

Tipi di dati Parquet:

  • NULL

  • BOOLEAN

  • FLOAT

  • DOUBLE

  • STRING

  • NUMERO INTERO CON SEGNO: UINT8, UINT16, UINT32, UINT64

  • MAP: supporta solo un livello. Non supporta nested.

  • ELENCO: supporta solo un livello. Non supporta nested.

Neptune-specific tipi di dati:

A differenza delle intestazioni delle colonne delle proprietà in formato CSV, le intestazioni delle colonne delle proprietà del formato Parquet devono contenere solo i nomi delle proprietà, quindi non è necessario avere i nomi dei tipi né la cardinalità.

Esistono tuttavia alcuni tipi di colonna speciali nel formato Parquet che richiedono l'annotazione nei metadati, tra cui il tipo Qualsiasi, il tipo Date, il tipo DateTime e il tipo Geometry. L'oggetto seguente è un esempio dell'annotazione dei metadati richiesta per i file contenenti colonne di questi tipi speciali:

"metadata": { "anyTypeColumns": ["UserCol1"], "dateTypeColumns": ["UserCol2"], "dateTimeTypeColumns": ["UserCol3"], "geometryTypeColumns": ["UserCol4"] }

Di seguito sono riportati i dettagli sul payload previsto associato a questi tipi:

  • Il tipo di colonna Any è supportato nelle colonne utente. Un tipo Any è un tipo «zucchero sintattico» per tutti gli altri tipi supportati. È estremamente utile se una colonna utente contiene più tipi. Il payload di un valore di tipo Any è un elenco di stringhe json come segue:{"value": "10", "type": "Int"};{"value": "1.0", "type": "Float"}, che ha un campo valore e un campo tipo in ogni singola stringa json. Il valore di cardinalità di una colonna Any è impostato, il che significa che la colonna può accettare più valori.

    • Neptune supporta i seguenti tipi in un tipo Any: Bool (o Boolean), Byte, Short, Int, Long,,,,, Float, Double UnsignedByte, Date UnsignedShort UnsignedInt, UnsignedLong DateTime, String e Geometry.

    • Il tipo vettoriale non è supportato in Any type.

    • Nested Qualsiasi tipo non è supportato. Ad esempio, {"value": {"value": "10", "type": "Int"}, "type": "Any"}.

  • Le colonne di tipo Date e Datetime sono supportate nelle colonne utente. Il payload di queste colonne deve essere fornito come stringhe che seguono il formato XSD o uno dei formati seguenti:

    • aaaa- MM-dd

    • aaaa- MM-ddTHH:mm

    • aaaa- MM-ddTHH:mm:ss

    • aaaa- MM-ddTHH:mm:ssZ

    • aaaa- MM-ddTHH:mm:ss.SSSZ

    • aaaa- MM-ddTHH:mm:ss [+|-] hmm

    • aaaa- [+|-] hmm MM-ddTHH:mm:ss.SSS

  • Un tipo di colonna Geometry è supportato nelle colonne utente. Il payload di queste colonne deve contenere solo primitive Geometry di tipo Point, fornite come stringhe in Well-known formato testo (WKT). Ad esempio, POINT (30 10) sarebbe un valore Geometry valido.

Esempio di produzione di parquet

Dato un file Parquet come questo:

<s3 path> Parquet Type: int8 int16 int32 int64 float double string +--------+---------+-------------+----------------------+------------+------------+----------+ | Byte | Short | Int | Long | Float | Double | String | |--------+---------+-------------+----------------------+------------+------------+----------| | -128 | -32768 | -2147483648 | -9223372036854775808 | 1.23456 | 1.23457 | first | | 127 | 32767 | 2147483647 | 9223372036854775807 | nan | nan | second | | 0 | 0 | 0 | 0 | -inf | -inf | third | | 0 | 0 | 0 | 0 | inf | inf | fourth | +--------+---------+-------------+----------------------+------------+------------+----------+

Ecco un esempio dell'output restituito da neptune.read utilizzando la seguente query:

aws neptunedata execute-open-cypher-query \ --open-cypher-query "CALL neptune.read({source: '<s3 path>', format: 'parquet'}) YIELD row RETURN row" \ --endpoint-url https://my-cluster-name.cluster-abcdefgh1234.us-east-1.neptune.amazonaws.com:8182
{ "results": [{ "row": { "Float": 1.23456, "Byte": -128, "Int": -2147483648, "Long": -9223372036854775808, "String": "first", "Short": -32768, "Double": 1.2345678899999999 } }, { "row": { "Float": "NaN", "Byte": 127, "Int": 2147483647, "Long": 9223372036854775807, "String": "second", "Short": 32767, "Double": "NaN" } }, { "row": { "Float": "-INF", "Byte": 0, "Int": 0, "Long": 0, "String": "third", "Short": 0, "Double": "-INF" } }, { "row": { "Float": "INF", "Byte": 0, "Int": 0, "Long": 0, "String": "fourth", "Short": 0, "Double": "INF" } }] }

Attualmente, non è possibile impostare un'etichetta di nodo o bordo su un campo di dati proveniente da un file Parquet. Si consiglia di suddividere le interrogazioni in più interrogazioni, una per ciascuna. label/Type

CALL neptune.read({source: '<s3 path>', format: 'parquet'}) YIELD row WHERE row.`~label` = 'airport' CREATE (n:airport) CALL neptune.read({source: '<s3 path>', format: 'parquet'}) YIELD row WHERE row.`~label` = 'country' CREATE (n:country)