按列分组,并使用ApacheSpark和Java将每组字符串写入文本文件

按列分组,并使用ApacheSpark和Java将每组字符串写入文本文件,java,apache-spark,Java,Apache Spark,我有一个带有列id的.csv文件和几个字符串列。我想按id分组,然后将string_column1中的所有值写入文本文件(每一个值位于新行)。最后,我希望文本文件的名称为“allstrings”+id。 我正在使用ApacheSpark和Java 我曾尝试使用groupBy(“id”).agg(collect_list(“string_column1”)),但我得到“collect_list(string)方法对于Main类型是未定义的”。 我不知道如何使用id列中的不同值命名文本文件 impo

我有一个带有列id的.csv文件和几个字符串列。我想按id分组,然后将string_column1中的所有值写入文本文件(每一个值位于新行)。最后,我希望文本文件的名称为“allstrings”+id。 我正在使用ApacheSpark和Java

我曾尝试使用groupBy(“id”).agg(collect_list(“string_column1”)),但我得到“collect_list(string)方法对于Main类型是未定义的”。
我不知道如何使用id列中的不同值命名文本文件

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.RelationalGroupedDataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

public class Main {

    public static void main(String[] args) {
        Logger.getLogger("org.apache").setLevel(Level.WARN);

        SparkSession spark = SparkSession.builder()
                .appName("testingSql")
                .master("local[*]")
                .getOrCreate();

        Dataset<Row> dataset = spark.read()
        .option("header", true)
        .csv("src/main/resources/maininput.csv");

        // make a separate .csv file for each group of strings (grouped by id),
        // with each string on a new line
        // and the name of the file should be "allstrings"+id
        RelationalGroupedDataset result = dataset.groupBy("id")
                .agg(collect_list("string_column1"))
                .?????????;



        spark.close();
    }

}
import org.apache.log4j.Level;
导入org.apache.log4j.Logger;
导入org.apache.spark.sql.Dataset;
导入org.apache.spark.sql.RelationalGroupedDataset;
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.SparkSession;
公共班机{
公共静态void main(字符串[]args){
Logger.getLogger(“org.apache”).setLevel(Level.WARN);
SparkSession spark=SparkSession.builder()
.appName(“测试SQL”)
.master(“本地[*]”)
.getOrCreate();
Dataset数据集=spark.read()
.选项(“标题”,真)
.csv(“src/main/resources/maininput.csv”);
//为每组字符串创建一个单独的.csv文件(按id分组),
//每个字符串都位于新行上
//文件名应为“allstrings”+id
RelationalGroupedDataset结果=dataset.groupBy(“id”)
.agg(收集列表(“字符串列1”))
.?????????;
spark.close();
}
}

您可以在写入时对数据进行分区,它将为每个组
id
每个文件夹的名称将采用列\u name=值的格式

df.write.partitionBy(“id”).csv(“输出目录”)


然后您可以使用
org.apache.hadoop.fs.
重命名每个组目录中的文件。

谢谢。知道为什么我在使用groupBy(“id”).agg(collect_list(“String_column1”))时会得到“类型Main的方法collect_list(String)未定义”吗?这是scala方法吗?我可以在Java中使用什么?您应该导入sql.functions来使用collect\u list或执行类似操作:
.agg(org.apache.spark.sql.functions.collect\u list(“string\u column1”)
嗨,我使用的是这种方法,速度非常慢。还有别的办法吗?