如何迭代Spark中数据集的所有列(Java)

时间:2019-08-13 14:50:51

标签: java apache-spark foreach iteration

我有一个数据集,其中包含许多列(actuall 11000,但可能更多)和大约40000行。我想做的是将UDF应用于所有这些列(此UDF只是通过用字符替换来缩短列的字符串)。我的方法工作正常,但实际上效率不高,因为我使用了for循环来迭代所有列。有没有机会使用foreach()函数或类似的东西来并行执行所有11000列的执行?

        sqlContext.udf().register("replaceStringByChar", replaceStringByChar, DataTypes.StringType);


        for (String c : ds.columns()) {
            ds = ds.withColumn(c, functions.callUDF("replaceStringByChar", ds.col(c)));
        }

2 个答案:

答案 0 :(得分:0)

我认为类似的东西应该有用

ds.columns().foreach(column -> {
  System.out.println("Column" + column);
});

答案 1 :(得分:0)

我遇到了类似的问题,并且找到了使用withColumns对象的Dataset<Row>方法的解决方案。检查这篇文章: Iterate over different columns using withcolumn in Java Spark 对于您的情况将是这样的:

List<String> fieldsNameList = ds.columns();
Seq<String> fieldsNameSeq = JavaConversions.asScalaBuffer(fieldsNameList).seq();

List<Column> whenColumnList = new ArrayList(Arrays.asList());

for (String c : ds.columns()) {
        Column whenColumn = functions.callUDF("replaceStringByChar", ds.col(c))
        whenColumnList.add(whenColumn)
}

Seq<Column> whenColumnSeq = JavaConversions.asScalaBuffer(whenColumnList).seq();

Dataset<Row>  ds_new = ds.withColumns(fieldsNameSeq, whenColumnSeq);