如何在可能为null的列上使用PySpark CountVectorizer

时间:2016-11-01 00:51:31

标签: apache-spark pyspark apache-spark-mllib

我的Spark DataFrame中有一列:

 |-- topics_A: array (nullable = true)
 |    |-- element: string (containsNull = true)

我正在使用CountVectorizer:

topic_vectorizer_A = CountVectorizer(inputCol="topics_A", outputCol="topics_vec_A")

我得到NullPointerExceptions,因为有时topic_A列包含null。

有解决方法吗?使用零长度数组填充它可以正常工作(虽然它会大大超出数据大小) - 但我无法解决如何在PySpark中的Array列上执行fillNa。

2 个答案:

答案 0 :(得分:3)

我个人会删除NULL值的列,因为那里没有有用的信息但你可以用空数组替换空值。首先进口一些:

from pyspark.sql.functions import when, col, coalesce, array

您可以将特定类型的空数组定义为:

fill = array().cast("array<string>")

并将其与when子句结合使用:

topics_a = when(col("topics_A").isNull(), fill).otherwise(col("topics_A"))

coalesce

topics_a = coalesce(col("topics_A"), fill)

并将其用作:

df.withColumn("topics_A", topics_a)

所以使用示例数据:

df = sc.parallelize([(1, ["a", "b"]), (2, None)]).toDF(["id", "topics_A"])

df_ = df.withColumn("topics_A", topics_a)
topic_vectorizer_A.fit(df_).transform(df_)

结果将是:

+---+--------+-------------------+
| id|topics_A|       topics_vec_A|
+---+--------+-------------------+
|  1|  [a, b]|(2,[0,1],[1.0,1.0])|
|  2|      []|          (2,[],[])|
+---+--------+-------------------+

答案 1 :(得分:0)

我有similar issue,基于评论,我在标记化之前使用了以下语法来解决:

删除空值

clean_text_ddf.where(col("title").isNull()).show()
cleaned_text=clean_text_ddf.na.drop(subset=["title"])
cleaned_text.where(col("title").isNull()).show()
cleaned_text.printSchema()
cleaned_text.show(2)

+-----+
|title|
+-----+
+-----+

+-----+
|title|
+-----+
+-----+

root
 |-- title: string (nullable = true)

+--------------------+
|               title|
+--------------------+
|Mr. Beautiful (Up...|
|House of Ravens (...|
+--------------------+
only showing top 2 rows