Как проверить преобразование типов данных во время приведения - PullRequest
0 голосов
/ 23 мая 2018

У нас есть скрипт, который отображает данные в фрейм данных (мы используем pyspark).Данные поступают в виде строки, и с ней выполняются некоторые другие, иногда дорогостоящие вещи, но как часть операции (вызывая withColumn) мы выполняем приведение к окончательному типу данных.

У меня есть требование кскажите, произошло ли усечение, но мы не хотим потерпеть неудачу, если оно произойдет.Мы просто хотим, чтобы число знало, сколько строк в каждом переведенном столбце (их около 300) потерпело неудачу.

Моей первой мыслью было, чтобы каждый столбец проходил через UDF, который будет выполнять тест, и выводбудет массив со значением и значением, если он прошел проверки типа данных.Я бы тогда сделал 2 выбора.Один выбирает необработанные значения из массива, а другой объединяет пропуски.Но это похоже на неаккуратное решение.Я довольно новичок в мире pyspark / hadoop ... хотел бы знать, есть ли лучший (может быть стандартный?) Способ сделать это.

1 Ответ

0 голосов
/ 23 мая 2018

В последних версиях Spark приведение чисел в Spark не приводит к сбоям и не приводит к тихим переполнениям - если значение не отформатировано должным образом или слишком велико для соответствия целевому типу, результат не определен - NULL.

Итак, все, что вам нужно сделать, - это просто подсчитать значения NULL ( Подсчитать количество не-NaN записей в каждом столбце кадра данных Spark с Pyspark ) после cast:

from pyspark.sql.functions import count

df = spark.createDataFrame(['132312312312312321312312', '123', '32'], 'string')
df_cast = df.withColumn('value_casted' , df['value'].cast('integer'))

df_cast.select((
    # count('value')         - count of NOT NULL values before
    # count('value_casted')  - count of NOT NULL values after
    count('value') - count('value_casted')).alias('value_failed')
).show()
# +------------+
# |value_failed|
# +------------+
# |           1|
# +------------+
...