【问题标题】:How to cast all columns of Spark Dataset to String in Java without withColumn?java - 如何在没有withColumn的情况下将Spark Dataset的所有列转换为Java中的String?
【发布时间】:2025-11-26 03:55:02
【问题描述】:

我已尝试使用此处指定的 withColumn 的解决方案:

How to cast all columns of Spark dataset to string using Java

但是,该解决方案会影响大量列(1k-6k)的性能。它需要超过 6 个小时,然后中止。

或者,我正在尝试使用 map 进行如下投射,但在这里出现错误:

MapFunction<Column, Column> mapFunction = (c) -> {
    return c.cast("string");
};      

dataset = dataset.map(mapFunction, Encoders.bean(Column.class));

上面的 sn-p 错误:

The method map(Function1<Row,U>, Encoder<U>) in the type Dataset<Row> is not applicable for the arguments (MapFunction<Column,Column>, Encoder<Column>)

进口使用:

import org.apache.spark.api.java.function.MapFunction;

【问题讨论】:

    标签: java apache-spark casting


    【解决方案1】:

    您确定您的意思是 1k-6k 列还是行?

    但无论如何,我一般都是这样转换列的:

    import spark.implicits._
    
    val df = Seq((1, 2), (2, 3), (3, 4)).toDF("a", "b")
    
    val cols = for {
      a <- df.columns
    } yield col(a).cast(StringType)
    
    df.select(cols : _*)
    

    【讨论】:

    • 谢谢马特。但这是在 Scala 中。我需要 Java 的代码 sn-p。但后来我想通了。我用过:String[] strColNameArray = dataset.columns();List&lt;Column&gt; colNames = new ArrayList&lt;&gt;();for(String strColName : strColNameArray){colNames.add(new Column(strColName).cast("string"));}dataset = dataset.select(JavaConversions.asScalaBuffer(colNames));
    • 抱歉,我似乎没有完全阅读您的问题
    • 别担心!感谢您的帮助!
    【解决方案2】:

    为任何寻找这个的人找到了以下解决方案:

    String[] strColNameArray = dataset.columns();
    List<Column> colNames = new ArrayList<>();
    for(String strColName : strColNameArray){
        colNames.add(new Column(strColName).cast("string"));
    }
    dataset = dataset.select(JavaConversions.asScalaBuffer(colNames));`
    

    【讨论】:

      最近更新 更多