spark数据帧API中的tokenizer

时间:2016-01-06 13:03:26

标签: scala apache-spark dataframe apache-spark-sql apache-spark-ml

Spark数据框df的每一行都在列rawFV中包含一个以制表符分隔的字符串。我已经知道在选项卡上拆分将为所有行产生array of 3 strings。这可以通过以下方式验证:

df.map(row => row.getAs[String]("rawFV").split("\t").length != 3).filter(identity).count()

并确保计数确实为0

我的问题是:如何使用管道API执行此操作?

这是我试过的:

val tabTok = new RegexTokenizer().setInputCol("rawFV").setOutputCol("tk").setPattern("\t")
val pipeline = new Pipeline().setStages(Array(tabTok))
val transf = pipeline.fit(df)
val df2 = transf.transform(df)
df2.map(row => row.getAs[Seq[String]]("tk").length != 3).filter(identity).count()

不等于0

问题与缺失值的存在有关。例如:

example

RegexTokenizer的管道代码将在第一行返回3个字段,而在第二行仅返回2个字段。另一方面,第一个代码将在任何地方正确返回3个字段。

1 个答案:

答案 0 :(得分:3)

这是一种预期的行为。默认情况下,minTokenLength参数等于1以避免输出中出现空字符串。如果要返回空字符串,则应将其设置为0.

new RegexTokenizer()
  .setInputCol("rawFV")
  .setOutputCol("tk")
  .setPattern("\t")
  .setMinTokenLength(0)