pyspark在数据框中使用null替换多个值

时间:2018-12-21 12:50:24

标签: apache-spark pyspark pyspark-sql databricks

我有一个数据框(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。

3 个答案:

答案 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()