Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Textual representation of the export parquet output file #4056

Closed
vga91 opened this issue Apr 23, 2024 · 2 comments
Closed

Textual representation of the export parquet output file #4056

vga91 opened this issue Apr 23, 2024 · 2 comments

Comments

@vga91
Copy link
Contributor

vga91 commented Apr 23, 2024

Check if it is possible to export a Parquet file, with the apoc.export.parquet.* procedure, in a textual representation instead of a binary one,
and add a flag if so.

See related Slack thread: https://neo4j.slack.com/archives/C136J23GE/p1713856995225349

@jexp
Copy link
Member

jexp commented May 16, 2024

Isn't that just CSV ?

Perhaps just wrap it in base64 encoding?

@vga91 vga91 moved this from Todo to Blocked in APOC Extended Larus May 27, 2024
@vga91 vga91 moved this from Blocked to Todo in APOC Extended Larus Dec 16, 2024
@vga91
Copy link
Contributor Author

vga91 commented Dec 17, 2024

Apache Parquet format is not human-readable and binary-based (instead of text-based) by definition, so there's no way to create a textual output.
Some references:

So, we should use other formats to create a readable file.


Even wrapping the byte[] with new String(..) is not human-readable, for example:

PAR1�������ō�������������������������ō�������������������������ō�������������������������ō������������������������������������������������������������ō���������������������R�R���ς	������������������������
���1999-01-01
���2000-01-01���.�.��֛������������������������������1����2�������ō��������������������������ʘ������������������������������������������������������������������0�0���������������������������������Another�������ō�������������������������ō�������������������������ō�������������������������ō�������������������������ō������������������������������������&���������������������&���������������������&���������������������&������������������&���F�����������������������&��������
1999-01-01��
2000-01-01������&���F�����������1���2������&���F�����������������������&�������������������������������������&�������������������������������������&���������Another���Another������&���F�����������������������&���������������������&���������������������&���������������������&���������������������&��������:����������B�:����������|�:����������:����������H�������������:�����������������(�������\�������������:�������������H����������J����������^�������������:�������������:����������:����������:����������:������������H
apocExport�"��%���name��%���place���%���male���%���age�5���kids����L<���5���list����%���element���%���born%�L���������5���listDate

The same thing by doing Base64.getEncoder().encodeToString(...):

UEFSMRUAFSoVKhWWz96QChwVBBUAFQYVCAAAAgAAAAMDBAAAAEFkYW0DAAAASmltFQAVhgEVhgEVl5mAygccFQQVABUGFQgAAAIAAAADATkAAABwb2ludCh7eDogMzMuNDY3ODksIHk6IDEzLjEsIHo6IDEwMC4wLCBjcnM6ICd3Z3MtODQtM2QnfSkVABUOFQ4VssfL6gwcFQQVABUGFQgAAAIAAAADAQEVBBUQFRAV7oel2QE8FQIVBAAAKgAAAAAAAAAVABUQFRAVzZ TkAocFQQVBBUGFQgAAAIAAAADAwADFQAVWBVYFdqq2rkKHBUKFQAVBhUGAAACAAAAAw4DAAAAA/8AAwAAAFNhbQQAAABBbm5hBQAAAEdyYWNlAwAAAFF3ZRUAFRwVHBWAwerUDRwVBBUAFQYVCAAAAgAAAAMBQEmDaE0BAAAVABUaFRoVkK/b0AwcFQQVABUGFQYAAAIAAAADAAMAAAADAAAVABUaFRoVkK/b0AwcFQQVABUGFQYAAAIAAAADAAMAAAADAAAVABUMFQwVqbLFjQUcFQQVABUGFQgAAAIAAAADABUAFQwVDBWpssWNBRwVBBUAFQYVCAAAAgAAAAMAFQAVLBUsFdGq1OUGHBUEFQAVBhUIAAACAAAAAwMYAAAAAAAAABkAAAAAAAAAFQQVEBUQFY 

The only usable way seems to be using a ParquetReader.

The batch produced which is used via ParquetWriter.write() is something like this:

name: Adam
place: point({x: 33.46789, y: 13.1, z: 100.0, crs: 'wgs-84-3d'})
male: true
age: 42
kids
  list
    element: Sam
  list
    element: Anna
  list
    element: Grace
  list
    element: Qwe
born: 1431977544000
__id: 4
__labels
  list
    element: User

Therefore, instead of parquet, we could use the apoc.export.yaml.*,
or also the apoc.export.csv.* / apoc.export.json.* would be good.

@vga91 vga91 closed this as completed Dec 17, 2024
@github-project-automation github-project-automation bot moved this from Todo to Done (check if cherry-pick) in APOC Extended Larus Dec 17, 2024
@vga91 vga91 moved this from Done (check if cherry-pick) to Done in APOC Extended Larus Dec 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Development

No branches or pull requests

2 participants