PySpark SQL TRY_CAST?

У меня есть данные в Dataframe, все столбцы в виде строк. Теперь некоторые данные в столбце числовые, поэтому я могу преобразовать их в float. Другие строки на самом деле содержат строки, которые я не хочу преобразовывать.

Так что я искал что-то вроде try_cast и уже пытался что-то построить на .when().otherwise(), но пока безуспешно.

casted = data.select(when(col("Value").cast("float").isNotNull(), col("Value").cast("float")).otherwise(col("Value")))

Это не работает, в итоге никогда не забросит.

Возможно ли что-то подобное (производительно без UDF и т. Д.)?


person silent    schedule 07.12.2018    source источник


Ответы (1)


В искре не может быть столбца с двумя типами: либо с плавающей точкой, либо с строкой. Вот почему ваш столбец всегда имеет string тип (потому что он может содержать как строки, так и числа с плавающей запятой).

Ваш код делает следующее: если число в столбце Value не помещается в число с плавающей запятой, оно будет преобразовано в число с плавающей запятой, а затем в строку (попробуйте с> 6 десятичными знаками). Насколько мне известно, TRY_CAST преобразуется в значение или ноль (по крайней мере, в SQL Server), так что это именно то, что делает искра cast.

person Mariusz    schedule 07.12.2018
comment
Я не понимаю этого предложения, если число в столбце Value не помещается в число с плавающей запятой, оно будет преобразовано в число с плавающей запятой, а затем в строку (попробуйте ›с 6 десятичными знаками). Но я полагаю, что ваша общая точка верна здесь: A столбец не может содержать разные типы - person silent; 07.12.2018
comment
Попробуйте провести эксперимент с фреймом данных, содержащим строку 3.111111111111 в столбце Value. Ваш код должен преобразовать его в строку 3.11111 из-за преобразования строки ›с плавающей точкой› в строку. - person Mariusz; 07.12.2018