Skip to main content

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 -> doelWat het wordt
string -> timestamptry_to_timestamp(col, "fmt")
string -> datecast(try_to_timestamp(col, "fmt") as date)
string -> float/double/decimal/booltry_cast(col as <type>)
string -> byte/short/int/longkale cast — try_cast('3.0' as int) geeft NULL waar cast 3 geeft
niet-string -> wat dan ookkale 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 de
  • vorm - een kale naam, backticks wanneer de naam spaties of leestekens kan bevatten, of een hele expressie zoals regexp_replace(`bedrag`, &#x27;,&#x27;, &#x27;.&#x27;).
  • 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 leest try_to_timestamp het standaardformaat.

Returns:

De expressie als string, klaar voor SilverExpression of expr().