You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@arrow.apache.org by "spenczar (via GitHub)" <gi...@apache.org> on 2023/08/03 00:16:55 UTC

[GitHub] [arrow] spenczar opened a new issue, #37004: [Python] pyarrow.Table.cast does not handle extension types which wrap list types

spenczar opened a new issue, #37004:
URL: https://github.com/apache/arrow/issues/37004

   ### Describe the bug, including details regarding any error messages, version, and platform.
   
   I'm taking a table and casting it to its own schema. This should _always_ work, but it errors in a certain case.
   
   (this is deep in some library code - please forgive how strange this scenario is; just trust me that it really does happen!)
   
   ```py
   # An extension type which wraps list-of-int32:
   class MyExtensionType(pa.PyExtensionType):
       def __init__(self):
           pa.PyExtensionType.__init__(self, pa.list_(pa.int32()))
       def __reduce__(self):
           return MyExtensionType, (),
   
   # an array of this type:
   ext_array = pa.array([[1, 2, 3]], MyExtensionType())
   # Wrap that in a struct:
   struct_array = pa.StructArray.from_arrays([ext_array], "x")
   # Wrap the struct in a table:
   table = pa.Table.from_arrays([struct_array], ["field1"])
   ```
   All of the above is fine, and then:
   ```python
   table.cast(table.schema)
   ```
   Blows up:
   ```
   File ~/.pyenv/versions/3.10.10/envs/general-3.10/lib/python3.10/site-packages/pyarrow/table.pxi:3616, in pyarrow.lib.Table.cast()
   
   File ~/.pyenv/versions/3.10.10/envs/general-3.10/lib/python3.10/site-packages/pyarrow/table.pxi:3798, in pyarrow.lib.Table.from_arrays()
   
   File ~/.pyenv/versions/3.10.10/envs/general-3.10/lib/python3.10/site-packages/pyarrow/table.pxi:2962, in pyarrow.lib.Table.validate()
   
   File ~/.pyenv/versions/3.10.10/envs/general-3.10/lib/python3.10/site-packages/pyarrow/error.pxi:100, in pyarrow.lib.check_status()
   
   ArrowInvalid: Column 0: In chunk 0: Invalid: Struct child array #0 invalid: Invalid: Expected 1 child arrays in array of type list<item: int32>, got 0
   ```
   I can print `table` just fine:
   ```
   pyarrow.Table
   field1: struct<x: extension<arrow.py_extension_type<MyExtensionType>>>
     child 0, x: extension<arrow.py_extension_type<MyExtensionType>>
   ----
   field1: [
     -- is_valid: all not null
     -- child 0 type: extension<arrow.py_extension_type<MyExtensionType>>
   [[1,2,3]]]
   ```
   
   ### Component(s)
   
   Python


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@arrow.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [C++][Python] Casting extension types with list-based storage segfaults [arrow]

Posted by "connorsimms (via GitHub)" <gi...@apache.org>.
connorsimms commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-4961891627

   Hello! I've looked into this issue and I've diagnosed the cause in `array/data.cc`. I've got a fix with C++/Python tests, and i've also checked it against the Python snippets in this thread. If no one is working on this, I'd be more than happy to open a PR :).


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [arrow] spenczar commented on issue #37004: [Python] pyarrow.Table.cast does not handle extension types which wrap list types

Posted by "spenczar (via GitHub)" <gi...@apache.org>.
spenczar commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-1682953396

   Thanks for taking a look @AlenkaF. Here is a reproducer for FixedShapeTensor - it only happens if you go through the struct. The issue is mis-titled. It's actually a bug with Tables which contain a Struct field which have an ExtensionType which has a ListTyped-storage (whew, that's a lot!):
   
   ```py
   In [38]: import pyarrow as pa
   
   In [39]: tensor_type = pa.fixed_shape_tensor(pa.int32(), (2, 2))
   
   In [40]: arr = [[1, 2, 3, 4], [10, 20, 30, 40], [100, 200, 300, 400]]
   
   In [41]: storage = pa.array(arr, pa.list_(pa.int32(), 4))
   
   In [42]: tensor_array = pa.ExtensionArray.from_storage(tensor_type, storage)
       ...:
   
   In [43]: pa.StructArray.from_arrays([tensor_array], "x")
   Out[43]:
   <pyarrow.lib.StructArray object at 0x154e5a680>
   -- is_valid: all not null
   -- child 0 type: extension<arrow.fixed_shape_tensor>
     [
       [
         1,
         2,
         3,
         4
       ],
       [
         10,
         20,
         30,
         40
       ],
       [
         100,
         200,
         300,
         400
       ]
     ]
   
   In [44]: struct_array = pa.StructArray.from_arrays([tensor_array], "x")
   
   In [45]: table = pa.Table.from_arrays([struct_array], ["field1"])
   
   In [46]: table.cast(table.schema)
   ---------------------------------------------------------------------------
   ArrowInvalid                              Traceback (most recent call last)
   Cell In[46], line 1
   ----> 1 table.cast(table.schema)
   
   File ~/.pyenv/versions/3.10.12/envs/adam-core/lib/python3.10/site-packages/pyarrow/table.pxi:3616, in pyarrow.lib.Table.cast()
   
   File ~/.pyenv/versions/3.10.12/envs/adam-core/lib/python3.10/site-packages/pyarrow/table.pxi:3798, in pyarrow.lib.Table.from_arrays()
   
   File ~/.pyenv/versions/3.10.12/envs/adam-core/lib/python3.10/site-packages/pyarrow/table.pxi:2962, in pyarrow.lib.Table.validate()
   
   File ~/.pyenv/versions/3.10.12/envs/adam-core/lib/python3.10/site-packages/pyarrow/error.pxi:100, in pyarrow.lib.check_status()
   
   ArrowInvalid: Column 0: In chunk 0: Invalid: Struct child array #0 invalid: Invalid: Expected 1 child arrays in array of type fixed_size_list<item: int32>[4], got 0
   
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [Python] pyarrow.Table.cast does not handle extension types which wrap list types [arrow]

Posted by "AlenkaF (via GitHub)" <gi...@apache.org>.
AlenkaF commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-4405601094

   I asked Copilot to go through the backtrace and I checked the result. It does seem that, in both cases, when casting an extension type with list-based storage, the cast kernel produces `ArrayData` with the correct type but drops the child data. When the extension type then tries to wrap this into an `ExtensionArray` and calls `MakeArray`, it tries to construct a list array from that incomplete `ArrayData` and crashes.
   
   In case that helps anybody starting to look for a fix. Will also update the title to reflect the underlying bug.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [arrow] spenczar commented on issue #37004: [Python] pyarrow.Table.cast does not handle extension types which wrap list types

Posted by "spenczar (via GitHub)" <gi...@apache.org>.
spenczar commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-1666228253

   This seems to happen as well for FixedShapeTensor tensor types, which indicates it happens for fixed-size list types.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [C++][Python] Casting extension types with list-based storage segfaults [arrow]

Posted by "connorsimms (via GitHub)" <gi...@apache.org>.
connorsimms commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-4961922817

   take


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [C++][Python] Casting extension types with list-based storage segfaults [arrow]

Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou closed issue #37004: [C++][Python] Casting extension types with list-based storage segfaults
URL: https://github.com/apache/arrow/issues/37004


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [C++][Python] Casting extension types with list-based storage segfaults [arrow]

Posted by "pitrou (via GitHub)" <gi...@apache.org>.
pitrou commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-5043444141

   Issue resolved by pull request 50502
   https://github.com/apache/arrow/pull/50502


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [arrow] AlenkaF commented on issue #37004: [Python] pyarrow.Table.cast does not handle extension types which wrap list types

Posted by "AlenkaF (via GitHub)" <gi...@apache.org>.
AlenkaF commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-1681773809

   I can reproduce the first issue but cannot reproduce it for `FixedShapeTensor` array:
   
   ```python
   >>> import pyarrow as pa
   >>> import pyarrow as pa
   
   >>> tensor_type = pa.fixed_shape_tensor(pa.int32(), (2, 2))
   >>> arr = [[1, 2, 3, 4], [10, 20, 30, 40], [100, 200, 300, 400]]
   >>> storage = pa.array(arr, pa.list_(pa.int32(), 4))
   >>> tensor_array = pa.ExtensionArray.from_storage(tensor_type, storage)
   
   >>> data = [
   ...     pa.array([1, 2, 3]),
   ...     pa.array(['foo', 'bar', None]),
   ...     tensor_array,
   ... ]
   >>> my_schema = pa.schema([('f0', pa.int8()),
   ...                        ('f1', pa.string()),
   ...                        ('tensors_int', tensor_type)])
   >>> table = pa.Table.from_arrays(data, schema=my_schema)
   
   >>> table.cast(table.schema)
   pyarrow.Table
   f0: int8
   f1: string
   tensors_int: extension<arrow.fixed_shape_tensor>
   ----
   f0: [[1,2,3]]
   f1: [["foo","bar",null]]
   tensors_int: [[[1,2,3,4],[10,20,30,40],[100,200,300,400]]]
   ```
   
   I am not sure if the issue is in the struct or the underlying list type. But it seems to me that the casting of the column in the `table.cast` is behaving erroneous https://github.com/apache/arrow/blob/4fc2731a3ceaf7dd5b1dce6f29bf7cad0ab2f13e/python/pyarrow/table.pxi#L3694
   
   and I think this should work but it segfaults:
   
   ```python
   >>> struct_array = pa.StructArray.from_arrays([ext_array], "x")               
   >>> struct_array.type
   StructType(struct<x: extension<arrow.py_extension_type<MyExtensionType>>>)
   
   >>> struct_array.cast(struct_array.type)
   /Users/alenkafrim/repos/arrow/cpp/src/arrow/array/array_nested.cc:210:  Check failed: (data->child_data.size()) == (1) 
   0   libarrow.1300.0.0.dylib             0x0000000142366294 _ZN5arrow4util7CerrLog14PrintBackTraceEv + 52
   1   libarrow.1300.0.0.dylib             0x000000014236623c _ZN5arrow4util7CerrLogD2Ev + 120
   2   libarrow.1300.0.0.dylib             0x0000000142366184 _ZN5arrow4util7CerrLogD1Ev + 28
   3   libarrow.1300.0.0.dylib             0x00000001423661b0 _ZN5arrow4util7CerrLogD0Ev + 28
   4   libarrow.1300.0.0.dylib             0x0000000142366078 _ZN5arrow4util8ArrowLogD2Ev + 112
   5   libarrow.1300.0.0.dylib             0x00000001423660bc _ZN5arrow4util8ArrowLogD1Ev + 28
   6   libarrow.1300.0.0.dylib             0x0000000141d4f5f4 _ZN5arrow8internal11SetListDataINS_8ListTypeEEEvPNS_13BaseListArrayIT_EERKNSt3__110shared_ptrINS_9ArrayDataEEENS_4Type4typeE + 536
   7   libarrow.1300.0.0.dylib             0x0000000141d4eee8 _ZN5arrow9ListArray7SetDataERKNSt3__110shared_ptrINS_9ArrayDataEEE + 36
   8   libarrow.1300.0.0.dylib             0x0000000141d4ee34 _ZN5arrow9ListArrayC2ENSt3__110shared_ptrINS_9ArrayDataEEE + 68
   9   libarrow.1300.0.0.dylib             0x0000000141d4ef58 _ZN5arrow9ListArrayC1ENSt3__110shared_ptrINS_9ArrayDataEEE + 28
   10  libarrow.1300.0.0.dylib             0x0000000141ec14bc _ZNSt3__120__shared_ptr_emplaceIN5arrow9ListArrayENS_9allocatorIS2_EEEC2B6v15006IJRKNS_10shared_ptrINS1_9ArrayDataEEEEEES4_DpOT_ + 124
   11  libarrow.1300.0.0.dylib             0x0000000141ec1430 _ZNSt3__120__shared_ptr_emplaceIN5arrow9ListArrayENS_9allocatorIS2_EEEC1B6v15006IJRKNS_10shared_ptrINS1_9ArrayDataEEEEEES4_DpOT_ + 36
   12  libarrow.1300.0.0.dylib             0x0000000141ec13b0 _ZNSt3__115allocate_sharedB6v15006IN5arrow9ListArrayENS_9allocatorIS2_EEJRKNS_10shared_ptrINS1_9ArrayDataEEEEvEENS5_IT_EERKT0_DpOT1_ + 60
   13  libarrow.1300.0.0.dylib             0x0000000141ec1368 _ZNSt3__111make_sharedB6v15006IN5arrow9ListArrayEJRKNS_10shared_ptrINS1_9ArrayDataEEEEvEENS3_IT_EEDpOT0_ + 52
   14  libarrow.1300.0.0.dylib             0x0000000141eb0494 _ZN5arrow12_GLOBAL__N_116ArrayDataWrapper5VisitINS_8ListTypeEEENS_6StatusERKT_ + 52
   15  libarrow.1300.0.0.dylib             0x0000000141e97ccc _ZN5arrow15VisitTypeInlineINS_12_GLOBAL__N_116ArrayDataWrapperEJEEENS_6StatusERKNS_8DataTypeEPT_DpOT0_ + 1164
   16  libarrow.1300.0.0.dylib             0x0000000141e974d8 _ZN5arrow9MakeArrayERKNSt3__110shared_ptrINS_9ArrayDataEEE + 124
   17  libarrow.1300.0.0.dylib             0x000000014209c47c _ZN5arrow14ExtensionArray7SetDataERKNSt3__110shared_ptrINS_9ArrayDataEEE + 284
   18  libarrow.1300.0.0.dylib             0x000000014209c320 _ZN5arrow14ExtensionArrayC2ERKNSt3__110shared_ptrINS_9ArrayDataEEE + 84
   19  libarrow.1300.0.0.dylib             0x000000014209c51c _ZN5arrow14ExtensionArrayC1ERKNSt3__110shared_ptrINS_9ArrayDataEEE + 36
   20  libarrow_python.dylib               0x00000001066d2914 _ZNSt3__120__shared_ptr_emplaceIN5arrow14ExtensionArrayENS_9allocatorIS2_EEEC2B6v15006IJRNS_10shared_ptrINS1_9ArrayDataEEEEEES4_DpOT_ + 100
   21  libarrow_python.dylib               0x00000001066d25f0 _ZNSt3__120__shared_ptr_emplaceIN5arrow14ExtensionArrayENS_9allocatorIS2_EEEC1B6v15006IJRNS_10shared_ptrINS1_9ArrayDataEEEEEES4_DpOT_ + 36
   22  libarrow_python.dylib               0x00000001066d24f8 _ZNSt3__115allocate_sharedB6v15006IN5arrow14ExtensionArrayENS_9allocatorIS2_EEJRNS_10shared_ptrINS1_9ArrayDataEEEEvEENS5_IT_EERKT0_DpOT1_ + 60
   23  libarrow_python.dylib               0x00000001066d1240 _ZNSt3__111make_sharedB6v15006IN5arrow14ExtensionArrayEJRNS_10shared_ptrINS1_9ArrayDataEEEEvEENS3_IT_EEDpOT0_ + 52
   24  libarrow_python.dylib               0x00000001066d1160 _ZNK5arrow2py15PyExtensionType9MakeArrayENSt3__110shared_ptrINS_9ArrayDataEEE + 224
   25  libarrow.1300.0.0.dylib             0x0000000141eb0814 _ZN5arrow12_GLOBAL__N_116ArrayDataWrapper5VisitERKNS_13ExtensionTypeE + 84
   26  libarrow.1300.0.0.dylib             0x0000000141e97e10 _ZN5arrow15VisitTypeInlineINS_12_GLOBAL__N_116ArrayDataWrapperEJEEENS_6StatusERKNS_8DataTypeEPT_DpOT0_ + 1488
   27  libarrow.1300.0.0.dylib             0x0000000141e974d8 _ZN5arrow9MakeArrayERKNSt3__110shared_ptrINS_9ArrayDataEEE + 124
   28  libarrow.1300.0.0.dylib             0x0000000141d578d8 _ZNK5arrow11StructArray5fieldEi + 368
   29  libarrow.1300.0.0.dylib             0x00000001420b907c _ZN5arrow12_GLOBAL__N_112ArrayPrinter5VisitERKNS_11StructArrayE + 468
   30  libarrow.1300.0.0.dylib             0x00000001420b3aa0 _ZN5arrow16VisitArrayInlineINS_12_GLOBAL__N_112ArrayPrinterEJEEENS_6StatusERKNS_5ArrayEPT_DpOT0_ + 1308
   31  libarrow.1300.0.0.dylib             0x00000001420b19d0 _ZN5arrow12_GLOBAL__N_112ArrayPrinter5PrintERKNS_5ArrayE + 60
   32  libarrow.1300.0.0.dylib             0x00000001420b1b6c _ZN5arrow11PrettyPrintERKNS_5ArrayERKNS_18PrettyPrintOptionsEPNSt3__113basic_ostreamIcNS6_11char_traitsIcEEEE + 68
   33  libarrow.1300.0.0.dylib             0x00000001420b1bbc _ZN5arrow11PrettyPrintERKNS_5ArrayERKNS_18PrettyPrintOptionsEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE + 68
   34  lib.cpython-310-darwin.so           0x0000000105490a6c _ZL41__pyx_pf_7pyarrow_3lib_5Array_33to_stringP29__pyx_obj_7pyarrow_3lib_Arrayiiiib + 488
   35  lib.cpython-310-darwin.so           0x0000000105481a68 _ZL41__pyx_pw_7pyarrow_3lib_5Array_34to_stringP7_objectS0_S0_ + 1628
   36  Python                              0x0000000104787cfc cfunction_call + 60
   37  lib.cpython-310-darwin.so           0x00000001053a1e8c _ZL19__Pyx_PyObject_CallP7_objectS0_S0_ + 140
   38  lib.cpython-310-darwin.so           0x00000001053a7280 _ZL24__Pyx_PyObject_CallNoArgP7_object + 120
   39  lib.cpython-310-darwin.so           0x000000010547e380 _ZL39__pyx_pf_7pyarrow_3lib_5Array_37__str__P29__pyx_obj_7pyarrow_3lib_Array + 324
   40  lib.cpython-310-darwin.so           0x000000010547ce30 _ZL39__pyx_pw_7pyarrow_3lib_5Array_38__str__P7_object + 28
   41  Python                              0x000000010478cfac PyObject_Str + 172
   42  Python                              0x00000001047b97cc unicode_new + 116
   43  Python                              0x00000001047a4ad8 type_call + 84
   44  lib.cpython-310-darwin.so           0x00000001053a1e8c _ZL19__Pyx_PyObject_CallP7_objectS0_S0_ + 140
   45  lib.cpython-310-darwin.so           0x0000000105653be0 _ZL26__Pyx__PyObject_CallOneArgP7_objectS0_ + 176
   46  lib.cpython-310-darwin.so           0x00000001053a2b24 _ZL25__Pyx_PyObject_CallOneArgP7_objectS0_ + 116
   47  lib.cpython-310-darwin.so           0x000000010547d6b8 _ZL40__pyx_pf_7pyarrow_3lib_5Array_31__repr__P29__pyx_obj_7pyarrow_3lib_Array + 552
   48  lib.cpython-310-darwin.so           0x000000010547ce00 _ZL40__pyx_pw_7pyarrow_3lib_5Array_32__repr__P7_object + 28
   49  Python                              0x000000010478d17c PyObject_Repr + 156
   50  Python                              0x000000010474fe78 PyFile_WriteObject + 392
   51  Python                              0x000000010488d7c4 sys_displayhook + 200
   52  Python                              0x00000001047886fc cfunction_vectorcall_O + 100
   53  Python                              0x00000001048277d8 _PyEval_EvalFrameDefault + 15056
   54  Python                              0x0000000104822ab4 _PyEval_Vector + 376
   55  Python                              0x0000000104822928 PyEval_EvalCode + 104
   56  Python                              0x000000010487e998 run_eval_code_obj + 84
   57  Python                              0x000000010487e8fc run_mod + 112
   58  Python                              0x000000010487ec9c PyRun_InteractiveOneObjectEx + 656
   59  Python                              0x000000010487dbcc _PyRun_InteractiveLoopObject + 124
   60  Python                              0x000000010487d46c _PyRun_AnyFileObject + 76
   61  Python                              0x00000001048819a4 PyRun_AnyFileExFlags + 84
   62  Python                              0x00000001048a04a0 pymain_run_stdin + 160
   63  Python                              0x000000010489fa98 Py_RunMain + 512
   64  Python                              0x00000001048a1000 Py_BytesMain + 40
   65  dyld                                0x0000000191d6ff28 start + 2236
   zsh: abort      python
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] [Python] pyarrow.Table.cast does not handle extension types which wrap list types [arrow]

Posted by "NellyWhads (via GitHub)" <gi...@apache.org>.
NellyWhads commented on issue #37004:
URL: https://github.com/apache/arrow/issues/37004#issuecomment-2489962088

   Is this related to #34985?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@arrow.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org