2016-01-06 43 views
0

Spark數據幀df的每一行在列rawFV中包含製表符分隔的字符串。我已經知道在選項卡上分割將產生所有行的array of 3 strings。這可以通過驗證:火花數據幀中的標記器API

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個字段。

+0

如果您提供可用於重現問題的示例數據,它將更加有用。 – zero323

+0

它與缺失值的存在有關。例如,如果您有一個像這樣的製表符分隔的文件:「a \ ta \ ta \ nb \ t \ tb」。我會在第一行中得到3個字段,但在第二個字段中只能有2個 – ranlot

+0

可以將此添加到問題中? – zero323

回答

3

這是一個預期的行爲。默認minTokenLength參數等於1以避免輸出中出現空字符串。如果要返回空字符串,則應將其設置爲0.

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