我有一个包含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|
+----+----------+---+-----+-----+