[ 
https://issues.apache.org/jira/browse/ARROW-8810?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17108087#comment-17108087
 ] 

Uwe Korn edited comment on ARROW-8810 at 5/15/20, 8:47 AM:
-----------------------------------------------------------

Generally, you should see Parquet files as immutable. If you want to change its 
contents, it is almost always simpler and faster to just rewrite them 
completely or (much better) just write a second file and treat a directory of 
Parquet files as a single dataset. This comes down to two major properties:
 * Values in a Parquet file are encoded and compressed. Thus they don't adhere 
to a fixed size per row/value but in some cases a column chunk of a million 
values may be stored in just 64 bytes.
 * The metadata that contains all essential information, e.g. where row groups 
start, what schema the data is, is stored at the end of the file (i.e. the 
footer). Especially the last four bytes are needed as they indicate the start 
position of the footer.

Technically, you could still write code that appends to an existing Parquet 
file but this has the drawbacks that:
 * Writing wouldn't be faster than writing to a second, separate file. It would 
probably be even slower as we need to deserialize the existing metadata and 
serialize it again only with slight modifications.
 * Reading wouldn't be faster than reading from a second file, even when doing 
it sequentially.
 * While append to a Parquet file, the file would be unreadable.
 * If your process crashes during write, all existing data in the Parquet file 
will be lost.
 * It will give the users the impression that you could efficiently insert 
row-by-row to a file. With a columnar data format that can only leverage its 
techniques on large chunks of rows, this would generate a massive overhead.

Still if one would try to implement this, it would work as follows:
 # Read in the footer/metadata of the existing file.
 # Seek to the start position of the existing footer and overwrite it with the 
new data.
 # Merge (or rather concat) the existing metadata with the newly computed 
metadata and write it at the end of the file.

If you would take a look at how a completely fresh Parquet file would be 
written, this is identical except that we wouldn't need to read in and 
overwrite any existing metadata.

With newer Arrow releases, there will be better support for Parquet datasets in 
R, I'll leave this to [~npr] or [~jorisvandenbossche] to link to the right docs.


was (Author: xhochy):
Generally, you should see Parquet files as immutable. If you want to change its 
contents, it is almost always simpler and faster to just rewrite them 
completely or (much better) just write a second file and treat a directory of 
Parquet files as a single dataset. This comes down to two major properties:
 * Values in a Parquet file are encoded and compressed. Thus they don't adhere 
to a fixed size per row/value but in some cases a column chunk of a million 
values may be stored in just 64 bytes.
 * The metadata that contains all essential information, e.g. where row groups 
start, what schema the data is, is stored at the end of the file (i.e. the 
footer). Especially the last four bytes are needed as they indicate the start 
position of the footer.

Technically, you could still write code that appends to an existing Parquet 
file but this has the drawbacks that:
 * Writing wouldn't be faster than writing to a second, separate file. It would 
probably be even slower as we need to deserialize the existing metadata and 
serialize it again only with slight modifications.
 * Reading wouldn't be faster than reading from a second file, even when doing 
it sequentially.
 * While append to a Parquet file, the file would be unreadable.
 * If your process crashes during write, all existing data in the Parquet file 
will be lost.
 * It will give the users the impression that you could efficiently insert 
row-by-row to a file. With a columnar data format that can only leverage its 
techniques on large chunks of rows, this would generate a massive overhead.

Still if one would try to implement this, it would work as follows:
 # Read in the footer/metadata of the existing file.
 # Seek to the start position of the existing footer and overwrite it with the 
new data.
 # Merge (or rather concat) the existing metadata with the newly computed 
metadata and write it at the end of the file.

If you would take a look at how a completely fresh Parquet file would be 
written, this is identical except that we wouldn't need to read in and 
overwrite any existing metadata.

> Append to parquet file?
> -----------------------
>
>                 Key: ARROW-8810
>                 URL: https://issues.apache.org/jira/browse/ARROW-8810
>             Project: Apache Arrow
>          Issue Type: Improvement
>          Components: R
>            Reporter: Carl Boettiger
>            Priority: Major
>
> Is it possible to append new rows to an existing .parquet file using the R 
> client's arrow::write_parquet(), in a manner similar to the `append=TRUE` 
> argument in text-based output formats like write.table()? 
>  
> Apologies as this is perhaps more a question of documentation or user 
> interface, or maybe just my ignorance. 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to