View a markdown version of this page

Exemplos de consulta usando parquet - Amazon Neptune

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Exemplos de consulta usando parquet

O exemplo de consulta a seguir retorna o número de linhas em um determinado arquivo Parquet:

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

Você pode executar o exemplo de consulta usando a execute-open-cypher-query operação no AWS CLI executando o seguinte código:

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

Uma consulta pode ser flexível no que ela faz com linhas lidas de um arquivo Parquet. Por exemplo, a consulta a seguir cria um nó com um campo sendo definido para dados encontrados no arquivo Parquet:

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

Não é considerado uma boa prática usar uma grande cláusula produtora de resultados, como MATCH(n) antes de uma cláusula. CALL Isso levaria a uma consulta de longa duração, devido ao cruzamento entre soluções recebidas de cláusulas anteriores e as linhas lidas por neptune.read. É recomendável iniciar a consulta com CALL neptune.read.

Tipos de colunas de parquet compatíveis

Tipos de dados de parquet:

  • NULL

  • BOOLEAN

  • FLOAT

  • DOUBLE

  • STRING

  • INTEIRO ASSINADO: UINT8, UINT16, UINT32, UINT64

  • MAP: suporta apenas um nível. Não oferece suporte a aninhados.

  • LISTA: Suporta apenas um nível. Não oferece suporte a aninhados.

Neptune-specific tipos de dados:

Ao contrário dos cabeçalhos das colunas de propriedades do formato CSV, os cabeçalhos das colunas de propriedades do formato Parquet precisam ter apenas os nomes das propriedades, portanto, não é necessário ter os nomes dos tipos nem a cardinalidade.

No entanto, existem alguns tipos de colunas especiais no formato Parquet que exigem anotações nos metadados, incluindo o tipo Qualquer tipo, o tipo Data, o tipo DateTime e o tipo Geometria. O objeto a seguir é um exemplo da anotação de metadados necessária para arquivos que contêm colunas desses tipos especiais:

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

Abaixo estão os detalhes sobre a carga útil esperada associada a esses tipos:

  • Um tipo de coluna Qualquer é suportado nas colunas do usuário. Um tipo Qualquer é um tipo de “açúcar sintático” para todos os outros tipos que oferecemos suporte. É extremamente útil se uma coluna de usuário tiver vários tipos. A carga útil de um valor de qualquer tipo é uma lista de strings json da seguinte forma:{"value": "10", "type": "Int"};{"value": "1.0", "type": "Float"}, que tem um campo de valor e um campo de tipo em cada string json individual. O valor de cardinalidade de uma coluna Qualquer é definido, o que significa que a coluna pode aceitar vários valores.

    • O Neptune suporta os seguintes tipos em qualquer tipo: Bool (ou booleano), Byte, Short, Int, Long,,,,, Float, Double UnsignedByte UnsignedShort, Date UnsignedInt UnsignedLong, DateTime, String e Geometry.

    • O tipo de vetor não é suportado em Qualquer tipo.

    • Aninhado Qualquer tipo não é suportado. Por exemplo, .{"value": {"value": "10", "type": "Int"}, "type": "Any"}

  • As colunas do tipo Date e Datetime são suportadas nas colunas do usuário. A carga útil dessas colunas deve ser fornecida como strings seguindo o formato XSD ou um dos formatos abaixo:

    • 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 [+|-] hhmm

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

  • Um tipo de coluna Geometry é suportado nas colunas do usuário. A carga útil dessas colunas deve conter somente geometrias primitivas do tipo Point, fornecidas como cadeias de caracteres no Well-known formato de texto (WKT). Por exemplo, POINT (30 10) seria um valor de geometria válido.

Exemplo de saída de parquet

Dado um arquivo Parquet como este:

<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 | +--------+---------+-------------+----------------------+------------+------------+----------+

Aqui está um exemplo da saída retornada por neptune.read usando a seguinte consulta:

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" } }] }

Atualmente, não há como definir um rótulo de nó ou borda em um campo de dados proveniente de um arquivo Parquet. É recomendável particionar as consultas em várias consultas, uma para cada. 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)