按列分组,并使用ApacheSpark和Java将每组字符串写入文本文件
我有一个带有列id的.csv文件和几个字符串列。我想按id分组,然后将string_column1中的所有值写入文本文件(每一个值位于新行)。最后,我希望文本文件的名称为“allstrings”+id。 我正在使用ApacheSpark和Java 我曾尝试使用groupBy(“id”).agg(collect_list(“string_column1”)),但我得到“collect_list(string)方法对于Main类型是未定义的”。按列分组,并使用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列中的不同值命名文本文件
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”)
嗨,我使用的是这种方法,速度非常慢。还有别的办法吗?