ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

ARROW-11787: [R] Implement write csv - #10141

Closed
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv
Closed

ARROW-11787: [R] Implement write csv#10141
thisisnic wants to merge 27 commits into
apache:masterfrom
thisisnic:arrow-11787-write_csv

Conversation

@thisisnic

Copy link
Copy Markdown
Member

No description provided.

@github-actions

Copy link
Copy Markdown

@thisisnic
thisisnicforce-pushed the arrow-11787-write_csv branch from 3401d83 to 3239575CompareApril 27, 2021 14:13
@thisisnicthisisnic changed the title ARROW-11787: [R] Implement write csv [WIP]ARROW-11787: [R] Implement write csvApr 27, 2021
@thisisnic
thisisnic marked this pull request as ready for review April 27, 2021 14:13
Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This description doesn't look quite correct.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nicely done. Some suggestions/leading questions.

Comment threadr/R/csv.R Outdated
#' @docType class
#' @usage NULL
#' @format NULL
#' @description `CsvReadOptions`, `CsvParseOptions`, `CsvConvertOptions`,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An alternative to documenting this here (and cleaning up the bad copy-paste) would be to document it with CsvReadOptions et al.

Comment threadr/R/csv.R Outdated
#' }
#' @include arrow-package.R
write_csv_arrow <- function(x,
sink,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like indentation is slightly off here

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated now

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R Outdated
Comment on lines +643 to +644
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What happens if you remove these--will the C++ static typing validate this enough?

What happens if include_header = NA?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed those as totally sensible errors from the C++ as you say. If include_header = NA with the assert_that removed, no header is written.

Comment threadr/R/csv.R Outdated
assert_that(length(include_header) == 1)
assert_that(is.logical(include_header))

write_options = CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
write_options=CsvWriteOptions$create(include_header, batch_size)
write_options<-CsvWriteOptions$create(include_header, batch_size)

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/R/csv.R Outdated
x <- Table$create(x)
}

assert_is(x, c("Table", "RecordBatch"))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
assert_is(x, c("Table", "RecordBatch"))
assert_is(x, "ArrowTabular")

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated

Comment threadr/tests/testthat/test-csv.R Outdated

})


Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should add tests for handling bad inputs too. Also might make more sense to put the writing tests at the bottom of the test file instead of the top.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

Comment threadr/tests/testthat/test-csv.R Outdated

expect_identical(tbl_in, tbl_expected)

skip("Doesn't yet work with date columns due to ARROW-12540")

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think you need to test the file-with-dates in every combination of parameters, just the first one is sufficient.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - updated.

Comment threadr/tests/testthat/test-csv.R Outdated
expect_identical(tbl_in, tbl_expected)
})

test_that("Write a CSV file with different batch sizes", {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this testing? What does batch_size do? It doesn't look like there is an observable difference in the output.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

batch size dictates how much data is buffered when translating to CSV

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So the output will be the same, but what's happening internally will be different. I included it as I wanted to make sure I could pass through the param, but I guess it's C++ functionality. Should I remove the tests for the different batch sizes and just make sure I can pass through the param once?

@nealrichardsonnealrichardson left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! Let's try moving the validation like this, and assuming the tests pass I'll merge (or someone else can)

Comment threadr/R/csv.R Outdated
Comment threadr/R/csv.R
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@thisisnic@westonpace@nealrichardson@emkornfield