Java-Spark: как получить значение столбца Dataset <Row>при итерации в цикле и использовать его в when (). В противном случае ()? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть Dataset<Row> со столбцами, имеющими значения "null" (пустой текст).
Я пытаюсь заменить "нулевой" текст на текст: \ N .
Для этого я использую логику, что я добавлю новый столбец с именем, к которому добавляется "_nulled", например, столбец abc становится abc_nulled , и этот новый столбец будетиметь значение "\ N" , если текущее значение - текст null , в противном случае значение остается прежним.
Для этого я использовал withColumn(<new name>, when(col.equalTo("null"), "\\N").otherwise(<existing_value>)).Как мне получить это <existing_value>.
Когда я передаю otherwise(ds.col(col_nm)), он не работает, возможно, потому что он ожидает String в otherwise() и находит Column.

Как я должен решить это?Вот код:

ArrayList<String> newCols = new ArrayList<String>();
List<String> reqColListCopy = Arrays.asList(reqCols);
Dataset<Row> testingDS = DS.selectExpr(JavaConverters.asScalaIteratorConverter(reqColListCopy.iterator()).asScala().toSeq())

//Creating newCols (ArrayList so that I can add/remove column names.
Iterator itrTmp2 = reqColListCopy.iterator();
while(itrTmp2.hasNext()){
    newCols.add((String)itrTmp2.next());
}

//Creating a List reference for newCols ArrayList. This will be used to get Seq(<columns>).
List<String> newColsList = newCols;

Iterator colListItr = reqColListCopy.iterator();
while(colListItr.hasNext())
{
    String col = colListItr.next().toString();
    testingDS = testingDS.selectExpr(convertListToSeq(newColsList))
            .withColumn(col+"_nulled",  functions.when(testingDS.col(col).equalTo("null"), functions.lit("\\N")).otherwise(testingDS.col(col))) //'otherwise' needs a string parameter
            .drop(testingDS.col(col));

    newCols.add(col+"_nulled");
    newCols.remove(col);
    newColsList = newCols;
}
Dataset<Row> testingDS = DS.selectExpr(JavaConverters.asScalaIteratorConverter(newColsList.iterator()).asScala().toSeq())

testingDS.show(false);

1 Ответ

0 голосов
/ 19 февраля 2019

Я решил это, передав столбец внутрь lit():

.withColumn(col+"_nulled",  functions.when(testingDS.col(col).equalTo("null"), functions.lit("\\N")).otherwise(functions.lit(testingDS.col(col)))) //'otherwise' needs a string parameter
...