easyfabric.conversions
Een plek die uit bron- en doeltype kiest hoe een kolom wordt geconverteerd.
De framework-semantiek is: een waarde die niet te lezen is wordt NULL, en de
violation-policy bepaalt daarna hoe erg dat is. Die semantiek leunde op
spark.sql.ansi.enabled=false, een sessievlag die Fabric zet en wij niet
bezitten. Met ANSI aan gooit een kale cast in plaats van NULL te geven, en
valt de hele load om op een enkele onleesbare cel.
Een uniforme try_cast over alles is niet het antwoord — dat was de fout van
#629, die cast('3.0' as int) = 3 stilletjes in NULL veranderde. De regel is
per bron/doel-paar, gemeten onder #627 op Spark 3.5.0 in beide ANSI-standen:
| Bron -> doel | Wat het wordt |
|---|---|
| string -> timestamp | try_to_timestamp(col, "fmt") |
| string -> date | cast(try_to_timestamp(col, "fmt") as date) |
| string -> float/double/decimal/bool | try_cast(col as <type>) |
| string -> byte/short/int/long | kale cast — try_cast('3.0' as int) geeft NULL waar cast 3 geeft |
| niet-string -> wat dan ook | kale cast — try_cast volgt de ANSI-resolutieregels ook met ansi=false, dus date -> int stopt met oplossen |
Nergens try_to_date: die functie bestaat niet op Spark 3.5.
Wat hiermee niet opgelost is, bewust: een integraal doel houdt zijn kale
cast en blijft dus ANSI-gevoelig. Met ANSI aan gooit die cast, ook op '3.0'.
Dat is de afweging uit #627 -- try_cast('3.0' as int) geeft NULL waar cast 3
geeft, en die stille 3-wordt-NULL is een erger kwaad dan een luide fout op een
stand die Fabric vandaag niet zet. De vorm die beide zou halen loopt over een
tussenstap (coalesce(try_cast(c as int), cast(try_cast(c as double) as int)));
die is nog niet langs de #627-meting geweest en staat hier dus niet in.
De expressie is SQL-tekst, geen pyspark.sql.functions-aanroep. try_to_timestamp
bestaat daar pas vanaf 3.5, en zo'n import zou de wheel op een oudere runtime
helemaal laten weigeren te laden. Als SQL-tekst wordt hij pas door de sessie
opgelost die hem draait.
conversion_expression
def conversion_expression(column: str,
source_type,
target_type,
date_format=None)
Geef de SQL-expressie die column van source_type naar target_type brengt.
Arguments:
column- Wat er gelezen wordt, als SQL-tekst. De aanroeper bepaalt devorm- een kale naam, backticks wanneer de naam spaties of leestekens kan bevatten, of een hele expressie zoalsregexp_replace(`bedrag`, ',', '.').source_type- Het Spark-type dat de kolom nu heeft.target_type- Het Spark-type dat de kolom moet krijgen.date_format- Het patroon voor een date- of timestamp-doel. Zonder patroon leesttry_to_timestamphet standaardformaat.
Returns:
De expressie als string, klaar voor SilverExpression of expr().