[Bug]: [Python] Type inference returns Any for attributes of NamedTuple-typed and nullable nested rows

Đang mở
#41,099 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức phù hợp với người mới
55/100
Loại issue
Lỗi
Độ rõ ràng
Đặc tả rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
python
Lĩnh vực
data-engineering

Hướng nghiên cứu

Start in sdks/python/apache_beam/typehints/opcodes.py, where _getattr only resolves fields when the type is a RowTypeConstraint. Reproduce with trivial_inference.infer_return_type on the Person/Address NamedTuples from the issue, then extend _getattr to accept NamedTuple classes via RowTypeConstraint.from_user_type and unwrap Optional[row] while keeping the result nullable. Done when both lambdas infer str and Optional[str] in trivial_inference_test.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

awaiting triage bug P2 python yaml
What happened?

Accessing a nested field of a schema-aware PCollection is inferred as Any. In Beam YAML this makes a common pipeline fail at construction: a MapToFields that projects a field of a Parquet struct column feeds WriteToParquet, which raises NotImplementedError: Beam logical types are not currently supported in arrow_type_compatibility (#23817) because the inferred field type is Any.

Reproducer (Parquet file with name: string, address: struct<city: string, zip: int64>):

pipeline:
  type: chain
  transforms:
  - type: ReadFromParquet
    config:
      path: people_struct.parquet
  - type: MapToFields
    config:
      language: python
      fields:
        name: name
        city: address.city
  - type: WriteToParquet
    config:
      path: out/people

ValueError: Error applying transform "WriteToParquet" at line 13: Beam logical types are not currently supported in arrow_type_compatibility.

The same happens with trivial_inference directly:

import typing
from apache_beam.typehints import trivial_inference

class Address(typing.NamedTuple):
  city: str

class Person(typing.NamedTuple):
  name: str
  address: typing.Optional[Address]

trivial_inference.infer_return_type(lambda r: r.name, [Person])          # Any (expected str)
trivial_inference.infer_return_type(lambda r: r.address.city, [Person])  # Any (expected Optional[str])
Cause

opcodes._getattr (sdks/python/apache_beam/typehints/opcodes.py) resolves row.field only when the type is a RowTypeConstraint. Schema-aware PCollections are usually typed with the NamedTuple class generated for their schema (for example ReadFromParquet(as_rows=True) produces a BeamSchema_... class), and nested struct fields are Optional[Row] / Optional[NamedTuple], so both cases fall through to Any.

Resolving NamedTuple classes through RowTypeConstraint.from_user_type and unwrapping Optional[row] (keeping the result nullable) fixes inference. I have a small fix with tests in trivial_inference_test and can open a PR.

Note: with that fix the Parquet pipeline above builds, but then fails at runtime due to a separate issue where ReadFromParquet(as_rows=True) yields dicts for struct fields (filed separately).

Issue Priority

Priority: 2 (default / most bugs should be filed as P2)

Issue Components
  • Component: Python SDK
  • Component: Java SDK
  • Component: Go SDK
  • Component: Typescript SDK
  • Component: IO connector
  • Component: Beam YAML
  • Component: Beam examples
  • Component: Beam playground
  • Component: Beam katas
  • Component: Website
  • Component: Infrastructure
  • Component: Spark Runner
  • Component: Flink Runner
  • Component: Prism Runner
  • Component: Hazelcast Jet Runner
  • Component: Google Cloud Dataflow Runner
Ngôn ngữ chính
Java
Star
8.7k
Fork
4.8k
Merge trung bình
2 ngày 12 giờ
Pull request đã merge (30 ngày)
371

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/beam

Tất cả issue của apache/beam

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.