У меня есть данные в Dataframe, все столбцы в виде строк. Теперь некоторые данные в столбце числовые, поэтому я могу преобразовать их в float. Другие строки на самом деле содержат строки, которые я не хочу преобразовывать.
Так что я искал что-то вроде try_cast и уже пытался что-то построить на .when().otherwise(), но пока безуспешно.
casted = data.select(when(col("Value").cast("float").isNotNull(), col("Value").cast("float")).otherwise(col("Value")))
Это не работает, в итоге никогда не забросит.
Возможно ли что-то подобное (производительно без UDF и т. Д.)?
Ответ 1 · рейтинг 2 · Mariusz
В искре не может быть столбца с двумя типами: либо с плавающей точкой, либо с строкой. Вот почему ваш столбец всегда имеет string тип (потому что он может содержать как строки, так и числа с плавающей запятой).
Ваш код делает следующее: если число в столбце Value не помещается в число с плавающей запятой, оно будет преобразовано в число с плавающей запятой, а затем в строку (попробуйте с> 6 десятичными знаками). Насколько мне известно, TRY_CAST преобразуется в значение или ноль (по крайней мере, в SQL Server), так что это именно то, что делает искра cast.