[
https://issues.apache.org/jira/browse/ARROW-13169?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jonathan Keane updated ARROW-13169:
-----------------------------------
Description:
_This is a regression after 4.0.1 so is not a live-bug in a release version of
arrow_
When a partition key happens to be ordered, on large (>=1e7 rows), the
partitions are not being written faithfully.
If the partition isn't ordered or the dataset is smaller than 1e7 the
partitions appear to be correct (though we should check that the values in
other rows do still match when we test this).
{code:r}
library(arrow)
dir <- "./1M_records"
n_row <- 1e6
df <- data.frame(foo = runif(n_row))
df$let <- sort(sample(letters, n_row, replace = TRUE))
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (and is)
length(list.files(dir))
#> [1] 26
dir <- "./10M_records_not_sorted"
n_row <- 1e7
df <- data.frame(foo = runif(n_row))
df$let <- sample(letters, n_row, replace = TRUE)
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (and is!)
length(list.files(dir))
#> [1] 26
dir <- "./10M_records"
n_row <- 1e7
df <- data.frame(foo = runif(n_row))
df$let <- sort(sample(letters, n_row, replace = TRUE))
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (but is not)
length(list.files(dir))
#> [1] 3
# the letters that were retained:
list.files(dir)
#> [1] "let=a" "let=b" "let=c"
# Oddly(?) all of the rows are here, they have just been reshuffled into one of
the letters retained
nrow(open_dataset(dir))
#> [1] 10000000
{code}
h1. Original report for context:
A bit of context: the data for this example contains all the world exports in
1995, it contain 212 countries, but when saving it as parquet, only 66
countries are actually recorded. The verification I included was to check if
the USA (one of the best in the reporter quality index) was present in the data.
{code:r}
library(arrow)
#>
#> Attaching package: 'arrow'
#> The following object is masked from 'package:utils':
#>
#> timestamp
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
url <- "https://ams3.digitaloceanspaces.com/uncomtrade/baci_hs92_1995.rds"
rds <- "baci_hs92_1995.rds"
if (!file.exists(rds)) try(download.file(url, rds))
d <- readRDS("baci_hs92_1995.rds")
rds_has_usa <- any(grepl("usa", unique(d$reporter_iso)))
rds_has_usa
#> [1] TRUE
dir <- "parquet/baci_hs92"
d %>%
group_by(year, reporter_iso) %>%
write_dataset(dir, hive_style = F)
parquet_has_usa <- any(grepl("usa", list.files(paste0(dir, "/1995"))))
parquet_has_usa
#> [1] FALSE
{code}
_Created on 2021-06-24 by the reprex package (https://reprex.tidyverse.org)
(v2.0.0)_
was:
_This is a regression after 4.0.1 so is not a live-bug in a release version of
arrow_
When a partition key happens to be ordered, on large (>=1e7 rows), the
partitions are not being written faithfully.
If the partition isn't ordered or the dataset is smaller than 1e7 the
partitions appear to be correct.
{code:r}
library(arrow)
dir <- "./1M_records"
n_row <- 1e6
df <- data.frame(foo = runif(n_row))
df$let <- sort(sample(letters, n_row, replace = TRUE))
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (and is)
length(list.files(dir))
#> [1] 26
dir <- "./10M_records_not_sorted"
n_row <- 1e7
df <- data.frame(foo = runif(n_row))
df$let <- sample(letters, n_row, replace = TRUE)
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (and is!)
length(list.files(dir))
#> [1] 26
dir <- "./10M_records"
n_row <- 1e7
df <- data.frame(foo = runif(n_row))
df$let <- sort(sample(letters, n_row, replace = TRUE))
write_dataset(df, dir, partitioning = "let")
# this should be 26, corresponding to the number of letters (but is not)
length(list.files(dir))
#> [1] 3
# the letters that were retained:
list.files(dir)
#> [1] "let=a" "let=b" "let=c"
# Oddly(?) all of the rows are here, they have just been reshuffled into one of
the letters retained
nrow(open_dataset(dir))
#> [1] 10000000
{code}
h1. Original report for context:
A bit of context: the data for this example contains all the world exports in
1995, it contain 212 countries, but when saving it as parquet, only 66
countries are actually recorded. The verification I included was to check if
the USA (one of the best in the reporter quality index) was present in the data.
{code:r}
library(arrow)
#>
#> Attaching package: 'arrow'
#> The following object is masked from 'package:utils':
#>
#> timestamp
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
url <- "https://ams3.digitaloceanspaces.com/uncomtrade/baci_hs92_1995.rds"
rds <- "baci_hs92_1995.rds"
if (!file.exists(rds)) try(download.file(url, rds))
d <- readRDS("baci_hs92_1995.rds")
rds_has_usa <- any(grepl("usa", unique(d$reporter_iso)))
rds_has_usa
#> [1] TRUE
dir <- "parquet/baci_hs92"
d %>%
group_by(year, reporter_iso) %>%
write_dataset(dir, hive_style = F)
parquet_has_usa <- any(grepl("usa", list.files(paste0(dir, "/1995"))))
parquet_has_usa
#> [1] FALSE
{code}
_Created on 2021-06-24 by the reprex package (https://reprex.tidyverse.org)
(v2.0.0)_
> [R] [C++] sorted partition keys can cause issues
> ------------------------------------------------
>
> Key: ARROW-13169
> URL: https://issues.apache.org/jira/browse/ARROW-13169
> Project: Apache Arrow
> Issue Type: Bug
> Components: C++, R
> Reporter: Mauricio 'PachĂĄ' Vargas SepĂșlveda
> Priority: Blocker
> Fix For: 5.0.0
>
> Attachments: screenshot-1.png
>
>
> _This is a regression after 4.0.1 so is not a live-bug in a release version
> of arrow_
> When a partition key happens to be ordered, on large (>=1e7 rows), the
> partitions are not being written faithfully.
> If the partition isn't ordered or the dataset is smaller than 1e7 the
> partitions appear to be correct (though we should check that the values in
> other rows do still match when we test this).
> {code:r}
> library(arrow)
> dir <- "./1M_records"
> n_row <- 1e6
> df <- data.frame(foo = runif(n_row))
> df$let <- sort(sample(letters, n_row, replace = TRUE))
> write_dataset(df, dir, partitioning = "let")
> # this should be 26, corresponding to the number of letters (and is)
> length(list.files(dir))
> #> [1] 26
> dir <- "./10M_records_not_sorted"
> n_row <- 1e7
> df <- data.frame(foo = runif(n_row))
> df$let <- sample(letters, n_row, replace = TRUE)
> write_dataset(df, dir, partitioning = "let")
> # this should be 26, corresponding to the number of letters (and is!)
> length(list.files(dir))
> #> [1] 26
> dir <- "./10M_records"
> n_row <- 1e7
> df <- data.frame(foo = runif(n_row))
> df$let <- sort(sample(letters, n_row, replace = TRUE))
> write_dataset(df, dir, partitioning = "let")
> # this should be 26, corresponding to the number of letters (but is not)
> length(list.files(dir))
> #> [1] 3
> # the letters that were retained:
> list.files(dir)
> #> [1] "let=a" "let=b" "let=c"
> # Oddly(?) all of the rows are here, they have just been reshuffled into one
> of the letters retained
> nrow(open_dataset(dir))
> #> [1] 10000000
> {code}
> h1. Original report for context:
> A bit of context: the data for this example contains all the world exports
> in 1995, it contain 212 countries, but when saving it as parquet, only 66
> countries are actually recorded. The verification I included was to check if
> the USA (one of the best in the reporter quality index) was present in the
> data.
> {code:r}
> library(arrow)
> #>
> #> Attaching package: 'arrow'
> #> The following object is masked from 'package:utils':
> #>
> #> timestamp
> library(dplyr)
> #>
> #> Attaching package: 'dplyr'
> #> The following objects are masked from 'package:stats':
> #>
> #> filter, lag
> #> The following objects are masked from 'package:base':
> #>
> #> intersect, setdiff, setequal, union
> url <- "https://ams3.digitaloceanspaces.com/uncomtrade/baci_hs92_1995.rds"
> rds <- "baci_hs92_1995.rds"
> if (!file.exists(rds)) try(download.file(url, rds))
> d <- readRDS("baci_hs92_1995.rds")
> rds_has_usa <- any(grepl("usa", unique(d$reporter_iso)))
> rds_has_usa
> #> [1] TRUE
> dir <- "parquet/baci_hs92"
> d %>%
> group_by(year, reporter_iso) %>%
> write_dataset(dir, hive_style = F)
> parquet_has_usa <- any(grepl("usa", list.files(paste0(dir, "/1995"))))
> parquet_has_usa
> #> [1] FALSE
> {code}
> _Created on 2021-06-24 by the reprex package (https://reprex.tidyverse.org)
> (v2.0.0)_
--
This message was sent by Atlassian Jira
(v8.3.4#803005)