функция fill() в spark не работает должным образом

#apache-spark #pyspark #apache-spark-sql

Вопрос:

введите описание изображения здесь

Это набор данных, и я пытаюсь заполнить все нулевые значения»*****».

data.na.fill('*****').show() В идеале это утверждение должно заполнять все нули звездочкой. Но заменяются только нули в колонке «Город». Не знаю почему.

Комментарии:

1. Глядя на ваше изображение, есть только city столбец строкового типа, остальные-цифры. и ваше значение заполнения является строкой, поэтому заменяется только столбец «город»

Ответ №1:

Заполнение зависит от схемы вашего базового набора данных.

Как говорится в документе — fillna(value, subset=None)

значение должно быть сопоставлением имени столбца (строки) со значением замены. Значение замены должно быть значением int, с плавающей точкой, логическим значением или строкой.

Ниже приведен пример, демонстрирующий то же самое

Подготовка Данных

 input_str = """
|1  |704    |STANDARD|null               |PR   |30100
|2  |null    |null    |PASEO COSTA DEL SUR|PR   |null
|3  |709    |null    |BDA SAN LUIS       |PR   |3700
|4  |null  |UNIQUE  |CINGULAR WIRELESS  |TX   |84000
|5  |76177  |STANDARD|null               |TX   |null
""".split("|")

input_values = list(map(lambda x: x.strip() if x.strip() != 'null' else None, input_str[1:]))

n = len(input_values)

cols = ['id','zipcode','type','city','state','population']

input_list = [tuple(input_values[i:i 6]) for i in range(0,n,6)]

sparkDF = sql.createDataFrame(input_list, cols)

sparkDF.show()

 --- ------- -------- ------------------- ----- ---------- 
| id|zipcode|    type|               city|state|population|
 --- ------- -------- ------------------- ----- ---------- 
|  1|    704|STANDARD|               null|   PR|     30100|
|  2|   null|    null|PASEO COSTA DEL SUR|   PR|      null|
|  3|    709|    null|       BDA SAN LUIS|   PR|      3700|
|  4|   null|  UNIQUE|  CINGULAR WIRELESS|   TX|     84000|
|  5|  76177|STANDARD|               null|   TX|      null|
 --- ------- -------- ------------------- ----- ---------- 

root
 |-- id: string (nullable = true)
 |-- zipcode: string (nullable = true)
 |-- type: string (nullable = true)
 |-- city: string (nullable = true)
 |-- state: string (nullable = true)
 |-- population: string (nullable = true)
 

Филльна

Заполнение напрямую без приведения , как и в схеме string , заменит все нулевые значения на ***

 sparkDF = sparkDF.na.fill('****')

sparkDF.show()

 --- ------- -------- ------------------- ----- ---------- 
| id|zipcode|    type|               city|state|population|
 --- ------- -------- ------------------- ----- ---------- 
|  1|    704|STANDARD|               ****|   PR|     30100|
|  2|   ****|    ****|PASEO COSTA DEL SUR|   PR|      ****|
|  3|    709|    ****|       BDA SAN LUIS|   PR|      3700|
|  4|   ****|  UNIQUE|  CINGULAR WIRELESS|   TX|     84000|
|  5|  76177|STANDARD|               ****|   TX|      ****|
 --- ------- -------- ------------------- ----- ---------- 
 

Кастинг и заполнение

Приведение population и id к двойному типу и заполнение 0 заполняет нулевые значения в DoubleType столбцах до 0

 sparkDF = sparkDF.withColumn('zipcode',F.col('zipcode').cast(DoubleType()))
                 .withColumn('population',F.col('population').cast(DoubleType()))

sparkDF = sparkDF.na.fill(0)

sparkDF.show()

 --- ------- -------- ------------------- ----- ---------- 
| id|zipcode|    type|               city|state|population|
 --- ------- -------- ------------------- ----- ---------- 
|  1|  704.0|STANDARD|               null|   PR|   30100.0|
|  2|    0.0|    null|PASEO COSTA DEL SUR|   PR|       0.0|
|  3|  709.0|    null|       BDA SAN LUIS|   PR|    3700.0|
|  4|    0.0|  UNIQUE|  CINGULAR WIRELESS|   TX|   84000.0|
|  5|76177.0|STANDARD|               null|   TX|       0.0|
 --- ------- -------- ------------------- ----- ----------