PySpark:我如何根据列的数据类型替换空值?



我有一个包含257列的表。我试图找出如何改变空值是基于数据类型的表。我试图在PySpark中做到这一点。数据框架名为df.

例如,如果列中包含日期它是时间戳数据类型列中的空值必须为1900-01-01

如果是整数或浮点类型,则需要为0

如果是字符串类型,则应该是n/a

谢谢

df.dtypes将为您提供每个列的声明。像这样:

df = spark.createDataFrame([
    ('str', '2022-01-01', 1, 2.2, False),
    (None, None, None, None, None),
], ['text','date','int','float', 'bool'])
df = df.withColumn('date', F.col('date').cast('date'))
df.show()
df.printSchema()
print(df.dtypes)
+----+----------+----+-----+-----+
|text|      date| int|float| bool|
+----+----------+----+-----+-----+
| str|2022-01-01|   1|  2.2|false|
|null|      null|null| null| null|
+----+----------+----+-----+-----+
root
 |-- text: string (nullable = true)
 |-- date: date (nullable = true)
 |-- int: long (nullable = true)
 |-- float: double (nullable = true)
 |-- bool: boolean (nullable = true)
[('text', 'string'),
 ('date', 'date'),
 ('int', 'bigint'),
 ('float', 'double'),
 ('bool', 'boolean')]

有了这些信息,您可以根据其类型动态地强制转换任何默认值

for t in df.dtypes:
    if t[1] == 'string':
        df = df.withColumn(t[0], F.coalesce(t[0], F.lit('n/a')))
    elif t[1] == 'date':
        df = df.withColumn(t[0], F.coalesce(t[0], F.lit('1900-01-01')))
    elif t[1] == 'boolean':
        df = df.withColumn(t[0], F.coalesce(t[0], F.lit(False)))
    else:
        df = df.withColumn(t[0], F.coalesce(t[0], F.lit(0)))
    
df.show()
+----+----------+---+-----+-----+
|text|      date|int|float| bool|
+----+----------+---+-----+-----+
| str|2022-01-01|  1|  2.2|false|
| n/a|1900-01-01|  0|  0.0|false|
+----+----------+---+-----+-----+

最新更新