Apache spark 如果不在列表中,如何替换值?
我有一个列中所有值都不同的列表,我需要将不在此列表中的所有值替换为1 我试过这个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_
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")