我有一个数据框(df),并且在该数据框内我有一列 user_id
var obj ={$and:[{"createdOn":{$lte:"1712086400000"}},{"country": "India"},{"Type": "App"}]};
console.log(obj);
console.log(typeof obj);
function getKeyVal(ob){
Object.keys(ob).forEach(function(key) {
console.log("key > " +key + " value > "+JSON.stringify(ob[key]));
})
}
getKeyVal(obj);
df:
df = sc.parallelize([(1, "not_set"),
(2, "user_001"),
(3, "user_002"),
(4, "n/a"),
(5, "N/A"),
(6, "userid_not_set"),
(7, "user_003"),
(8, "user_004")]).toDF(["key", "user_id"])
我想用空值替换以下值: not_set,n / a,N / A和userid_not_set 。
如果我可以将任何新值添加到列表中并且可以更改它们,那就很好了。
我目前正在 spark.sql 中使用CASE语句来执行此操作,并希望将其更改为pyspark。
答案 0 :(得分:4)
None
函数内的 when()
对应于null
。如果您希望填写其他内容而不是null
,则必须在该位置填写。
from pyspark.sql.functions import col
df = df.withColumn(
"user_id",
when(
col("user_id").isin('not_set', 'n/a', 'N/A', 'userid_not_set'),
None
).otherwise(col("user_id"))
)
df.show()
+---+--------+
|key| user_id|
+---+--------+
| 1| null|
| 2|user_001|
| 3|user_002|
| 4| null|
| 5| null|
| 6| null|
| 7|user_003|
| 8|user_004|
+---+--------+
答案 1 :(得分:1)
您可以使用内置的when
函数,该函数等效于case
表达式。
from pyspark.sql import functions as f
df.select(df.key,f.when(df.user_id.isin(['not_set', 'n/a', 'N/A']),None).otherwise(df.user_id)).show()
所需的值也可以存储在list
中并被引用。
val_list = ['not_set', 'n/a', 'N/A']
df.select(df.key,f.when(df.user_id.isin(val_list),None).otherwise(df.user_id)).show()
答案 2 :(得分:0)
PFB的几种方法。我假设所有合法用户ID均以"user_"
开头。请尝试以下代码。
from pyspark.sql.functions import *
df.withColumn(
"user_id",
when(col("user_id").startswith("user_"),col("user_id")).otherwise(None)
).show()
另一个。
cond = """case when user_id in ('not_set', 'n/a', 'N/A', 'userid_not_set') then null
else user_id
end"""
df.withColumn("ID", expr(cond)).show()
另一个。
cond = """case when user_id like 'user_%' then user_id
else null
end"""
df.withColumn("ID", expr(cond)).show()
另一个。
df.withColumn(
"user_id",
when(col("user_id").rlike("user_"),col("user_id")).otherwise(None)
).show()