Apache spark 如果不在列表中,如何替换值?

Apache spark 如果不在列表中,如何替换值?,apache-spark,pyspark,Apache Spark,Pyspark,我有一个列中所有值都不同的列表,我需要将不在此列表中的所有值替换为1 我试过这个 uniq = X_train3.select('street').distinct().collect() X_test3 = X_test3.withColumn('street', F.when(array_contains('street', uniq), 1)) 我也试过: uniq = X_train3.select('street').distinct().collect() X_test3 = X_

我有一个列中所有值都不同的列表,我需要将不在此列表中的所有值替换为1

我试过这个

uniq = X_train3.select('street').distinct().collect()
X_test3 = X_test3.withColumn('street', F.when(array_contains('street', uniq), 1))
我也试过:

uniq = X_train3.select('street').distinct().collect()
X_test3 = X_test3.withColumn('street', F.when(~col('street').isin(uniq), 1))
两者都会导致此错误: java.lang.RuntimeException:不支持的文本类型类java.util.ArrayList[[1.0]]

这就是我在python和works中所做的:

uniq=X_train3[cl].unique()
uniq=uniq.tolist()
X_test3['street']=X_test3['street'].地图(如果X不在uniq else X中,则lambda X:1)]
您可以这样做(在Scala中,编写等效的pyspark):

此外,如果您确信独特街道的列表非常小(因为您尝试在代码中从驾驶员身上收集它),您可以在
X\u train3
周围提供
broadcast
提示。因此,代码变成:

val new_X_test3 = X_test3
.join(broadcast(X_train3
    .select("street")
    .distinct()
    .withColumnRenamed("street","street_train")), 
    col("street") === col("street_train"), 
    "leftouter")
.withColumn("street_test", 
    when(col("street_train").isNull, lit("1"))
    .otherwise(col("street")))
.drop("street","street_train")
.withColumnRenamed("street_test","street")

请参阅关于如何将列值收集到列表中的问题:为什么会被否决?它准确地回答了这个问题。我没有投反对票,但很明显,这个问题是关于PySpark的,而不是Spark,因此你的回答没有直接解决这个问题。
val new_X_test3 = X_test3
.join(broadcast(X_train3
    .select("street")
    .distinct()
    .withColumnRenamed("street","street_train")), 
    col("street") === col("street_train"), 
    "leftouter")
.withColumn("street_test", 
    when(col("street_train").isNull, lit("1"))
    .otherwise(col("street")))
.drop("street","street_train")
.withColumnRenamed("street_test","street")