【问题标题】:tokenizer in spark dataframe API火花数据框 API 中的标记器
【发布时间】:2016-04-10 14:05:55
【问题描述】:

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

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

带有RegexTokenizer 的管道代码将在第一行返回 3 个字段,但在第二行仅返回 2 个。另一方面,第一个代码将正确返回 3 个字段。

【问题讨论】:

  • 如果您提供可用于重现问题的示例数据会更有用。
  • 与缺失值的存在有关。例如,如果您有一个这样的制表符分隔文件:“a\ta\ta\nb\t\tb”。我会在第一行得到 3 个字段,但在第二行只有 2 个
  • 可以将此添加到问题中吗?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多