Java-Spark:如何在循环中迭代时获取 Dataset<Row> 列的值并在 when().otherwise() 中使用它?

Posted

技术标签:

【中文标题】Java-Spark:如何在循环中迭代时获取 Dataset<Row> 列的值并在 when().otherwise() 中使用它?【英文标题】:Java-Spark: how to get a Dataset<Row> column's value when iterating in a loop and use it in when().otherwise()? 【发布时间】:2019-02-19 10:48:27 【问题描述】:

我有一个Dataset&lt;Row&gt;,其列的值为"null"(空文字)。 我正在尝试将 "null" 文本替换为文本:\N。 为此,我使用了一个逻辑,我将添加一个名称附加“_nulled”的新列,例如abc 列变为 abc_nulled,如果当前值为文本 null,则此新列将具有值 "\N" > 否则价值保持不变。 为此,我使用了withColumn(&lt;new name&gt;, when(col.equalTo("null"), "\\N").otherwise(&lt;existing_value&gt;))。 我如何获得这个&lt;existing_value&gt;. 当我通过otherwise(ds.col(col_nm)) 时它不起作用,可能是因为它在otherwise() 中期待String 并找到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】:

我通过在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

【讨论】:

是否有检查非空值的选项?我实际上希望将非空值放在引号中,并且不修改空值

以上是关于Java-Spark:如何在循环中迭代时获取 Dataset<Row> 列的值并在 when().otherwise() 中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP与2个foreach循环中的数组进行比较时如何获取迭代次数

如何在刀片foreach循环中获取迭代次数

如何在EXTJS中循环遍历数组时获取范围

Rails:为循环的每次迭代从表中获取数据

Django模板:获取嵌套循环的总迭代次数

不使用循环从可迭代对象中获取值