繁体   English   中英

如何在spark(java)中迭代数据集的所有列

[英]How to iterate over all columns of dataset in spark (java)

我有一个包含许多列(实际 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)));
        }

我认为这样的事情应该有效

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

我有一个类似的问题,我找到了一个使用Dataset<Row>对象的withColumns方法的解决方案。 检查这篇文章: 在Java Spark中使用withcolumn迭代不同的列对于你的情况将是这样的:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM