错误报告和功能请求#

Arrow 依靠用户反馈来识别缺陷和改进机会。鼓励所有用户参与创建错误报告和功能请求或对现有问题发表评论。即使您自己无法为这些问题贡献解决方案,您的反馈也能帮助我们了解问题并优先考虑改进库的工作。

GitHub 问题#

Arrow 项目使用 GitHub 问题 来跟踪问题 - 包括错误报告和功能请求。

创建问题#

Apache Arrow 依靠社区贡献来解决报告的错误和功能请求。与大多数软件项目一样,贡献者的时间和资源是有限的。以下指南旨在生成高质量的错误报告和功能请求,使社区贡献者能够更快地响应更多问题

检查现有问题#

在创建新问题之前,我们建议您首先 搜索 未解决的现有问题,以识别相同的问题或功能请求。

问题描述#

对问题或请求的功能进行清晰的描述是任何问题中最重要的元素。有效的描述有助于开发人员理解并有效地参与报告的问题,并且可能包括以下内容

  • 清晰、最少的重现问题的步骤,并尽可能减少非 Arrow 依赖项。如果读取文件时出现问题,请尝试提供尽可能小的示例文件,或创建文件的代码。如果您的错误报告说“尝试读取我的文件时崩溃,但我无法与您共享”,那么我们很难调试。

  • 任何相关的操作系统、语言和库版本信息

  • 如果不明确,请清楚说明预期行为和实际发生的情况。

  • 避免在一个问题中加载多个问题或功能请求。每个问题都应该处理一个错误或功能。

如果开发人员无法获得失败的单元测试,他们将无法知道问题是否已被识别,也无法知道问题何时已修复。尝试预测可能有人会问您了解问题时可能会问到的问题,并在最开始提供这些支持细节。

下面提供了一些良好错误报告的示例

带有时区的时间戳的 print 方法错误

import pyarrow as pa

a = pa.array([0], pa.timestamp('s', tz='+02:00'))

print(a) # representation not correct?
# <pyarrow.lib.TimestampArray object at 0x7f834c7cb9a8>
# [
#  1970-01-01 00:00:00
# ]

print(a[0])
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#  File "pyarrow/scalar.pxi", line 80, in pyarrow.lib.Scalar.__repr__
#  File "pyarrow/scalar.pxi", line 463, in pyarrow.lib.TimestampScalar.as_py
#  File "pyarrow/scalar.pxi", line 393, in pyarrow.lib._datetime_from_int
#ValueError: fromutc: dt.tzinfo is not self

使用 col_types 选项 "T""t" 读取 CSV 文件时出错,而源数据以毫秒精度表示

library(arrow, warn.conflicts = FALSE)
tf <- tempfile()
write.csv(data.frame(x = '2018-10-07 19:04:05.005'), tf, row.names = FALSE)

# successfully read in file
read_csv_arrow(tf, as_data_frame = TRUE)
#> # A tibble: 1 × 1
#>   x
#>   <dttm>
#> 1 2018-10-07 20:04:05

# the unit here is seconds - doesn't work
read_csv_arrow(
  tf,
  col_names = "x",
  col_types = "T",
  skip = 1
)
#> Error in `handle_csv_read_error()`:
#> ! Invalid: In CSV column #0: CSV conversion error to timestamp[s]: invalid value '2018-10-07 19:04:05.005'

# the unit here is ms - doesn't work
read_csv_arrow(
  tf,
  col_names = "x",
  col_types = "t",
  skip = 1
)
#> Error in `handle_csv_read_error()`:
#> ! Invalid: In CSV column #0: CSV conversion error to time32[ms]: invalid value '2018-10-07 19:04:05.005'

# the unit here is inferred as ns - does work!
read_csv_arrow(
  tf,
  col_names = "x",
  col_types = "?",
  skip = 1,
  as_data_frame = FALSE
)
#> Table
#> 1 rows x 1 columns
#> $x <timestamp[ns]>

生成有用的错误报告的其他资源

识别 Arrow 组件#

Arrow 是一个广泛的项目,支持多种语言并组织成多个组件。识别受影响的组件有助于新问题获得相关贡献者的关注。

  • **组件标签**(可以由 Apache Arrow 项目的提交者添加)用于指示您的问题所属的项目区域(例如“组件:Python”或“组件:C++”)。

  • 在问题标题前加上方括号中的组件名称,例如 [Python] issue summary;这在浏览开放问题列表时很有帮助,也使我们的变更日志更易于阅读。大多数前缀与**组件**名称完全相同,但以下情况除外

    • **组件:**持续集成 — **摘要前缀:**[CI]

    • **组件:**开发工具 — **摘要前缀:**[Dev]

    • **组件:**文档 — **摘要前缀:**[Docs]

问题生命周期#

错误报告和功能请求都遵循定义的生命周期。如果当前正在处理某个问题,则应分配给开发人员。当问题达到最终状态时,它将关闭,并有两种结果

  • **关闭为已完成** - 表示问题已完成;解决该问题的 PR 应该已由 GitHub 自动链接(假设 PR 正确提到了问题编号)。

    如果您正在合并 PR,最佳实践是在链接的问题中添加一条关于哪个 PR 正在解决它的评论。这样,GitHub 就会为参与该问题的任何人创建通知。

  • **关闭为未计划** - 表示问题已关闭,并且不应接收任何进一步的更新,但无需采取任何措施。

问题分配#

分配表示承诺处理某个问题,并且贡献者在开始这项工作时应自行分配问题。现在,任何人都可以通过评论 take 来自行分配问题。