Nieoczekiwany błąd "Unimplemented type for cast"

0

Testuję DuckDB 0.7.0 i dostaję nieoczekiwany błąd przy prostej funkcjonalności:

DataFrame:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 63445 entries, 0 to 63444
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype 
---  ------       --------------  ----- 
 0   ID           63445 non-null  int64 
 1   PARENT_ID    63445 non-null  int64 
 2   TYPE         63445 non-null  object
 3   PARENT_TYPE  63445 non-null  object
 4   _TEXT        13230 non-null  object
 5   ATTR1        57175 non-null  object
 6   ATTR2        55024 non-null  object
 7   ATTR3        30547 non-null  object
 8   ATTR4        30502 non-null  object
 9   ATTR5        30502 non-null  object
 10  ATTR6        0 non-null      object
 11  ATTR7        0 non-null      object
 12  ATTR8        0 non-null      object
 13  ATTR9        1 non-null      object
 14  ATTR10       1 non-null      object
dtypes: int64(2), object(13)
memory usage: 7.3+ MB

Próbuję zrobić z DF tabelę w DuckDB

conn.sql('create table foobar as select * from df')

I dostaję:

duckdb.InvalidInputException: Invalid Input Error: Failed to cast value: Unimplemented type for cast (VARCHAR -> NULL)

Po wywalaniu ATTR9 i ATTR10 działa ok.
Po wypełnieniu ATTR9,ATTR10 (fillna('*')) działa ok.

Ktoś spotkał się z podobnym zachowaniem w DuckDB? Ktoś używa produkcyjnie tę bazę?

1

Dobra, sam sobie odpowiem. Pythonowe duckdb próbuje określić typ danych dla tworzonej w bazie duckdb kolumny. Robi to na podstawie rekordów z DFa, przy czym domyślnie ma ustawioną próbkę 1000 rekordów. Jeśli rekord non-null pojawia się w DF gdzieś dalej (>1000), to rzecz jasna nie uda się to.

Rozwiązania:

  1. Zwiększenie rozmiaru próbki = ilość rekordów w DF ( drastycznie spada wydajność tworzenia tabeli w duckdb)
  2. Nie używanie funkcjonalności :-) ( można utworzyć tabelę z ustawionymi typami bezpośrednio w DuckDB i korzystać z conn.append() )

1 użytkowników online, w tym zalogowanych: 0, gości: 1