使用 pyspark 在数据框中动态填充空列
Posted
技术标签:
【中文标题】使用 pyspark 在数据框中动态填充空列【英文标题】:Fill null columns dynamically in dataframe using pyspark 【发布时间】:2018-09-08 11:42:49 【问题描述】:我的数据框有 3 列,在这三列中,column3 中可能存在空值。此 DF 中的总记录为 200 万。 我需要通过 mysql 数据库中的值填充这个空值(基本上调用一个返回值的函数)。我可以考虑遍历每一行,但考虑到数据量,这可能会更耗时。 我怎样才能做到这一点,我知道如何用静态值填充空值,但这完全是动态的。 谢谢您的帮助 问候, 罗宾
【问题讨论】:
你想用你的函数返回的单个值替换 null 或者我错误地解释了这个问题 该函数每次调用时都会返回一个不同的值。这将返回一个序列,我需要将它们分配给每一行。 请阅读how to create good reproducible apache spark dataframe examples。 【参考方案1】:如果我正确地回答了您的问题,如果之前有 Null
值,您希望在列中具有一些唯一值。一种可能的方法是下面的代码,它检查value
列中的Null
值。如果找到Null
,它将使用 monotonically_increasing id 替换Null
。在其他情况下,原始值将保持不变。
test_df = spark.createDataFrame([
('a','2018'),
('b',None),
('c',None)
], ("col_name","value"))
test_df.withColumn("col3", when(col("value").isNull(), row_number()).otherwise(col("value"))).show(truncate=False)
结果:
+--------+-----+------------+
|col_name|value|col3 |
+--------+-----+------------+
|a |2018 |2018 |
|b |null |403726925824|
|c |null |609885356032|
+--------+-----+------------+
PS:对于未来的请求,如果您可以包含数据集中的样本和所需的输出,那就太好了。这通常有助于理解问题。
【讨论】:
谢谢我会尝试格式化并发布一个例子,你的陈述帮助我找到了解决方案。虽然 row_number() 对我不起作用(我使用的是 2.3.0)。可能 row_number() 改变了一些小写或大写,我也厌倦了。我将使用 monotonically_increasing_id() 来获取每一行的增量值。最后一个问题是我不想创建新列,但我想更新现有列。【参考方案2】:对于上述测试用例,我将使用以下命令仅更新两行的值列。 test_df.withColumn("value", when(col("value").isNull(), monotonically_increasing_id()).otherwise(col("value"))).show(truncate=False)
感谢所有 cmets 和帮助。
【讨论】:
以上是关于使用 pyspark 在数据框中动态填充空列的主要内容,如果未能解决你的问题,请参考以下文章