2016-01-06 2 views
0

Каждая строка информационной диаграммы Spark df содержит строку с разделителями табуляции в столбце rawFV. Я уже знаю, что разделение на вкладке даст array of 3 strings для всех строк. Это может быть проверено:tokenizer in spark dataframe 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)