Apache spark Spark-分别加载多个文件

Apache spark Spark-分别加载多个文件,apache-spark,apache-spark-sql,spark-dataframe,Apache Spark,Apache Spark Sql,Spark Dataframe,我是Spark的新手,这是我的第一个代码。如果我错了,请纠正我 我想加载多个文件,一个接一个-我不想引用一个文件夹一起处理。只想处理选定的文件 下面是我的代码(参考Spark docs),它可以处理单个文件,但当我处理多个文件时,它会为每个文件创建一个数据帧。我希望将数据添加到上一个数据框中,以便我添加的所有记录(来自多个文件)都位于单个表(mylogs)中。有什么方法可以做到这一点吗?我想分别为每个文件调用readFileToSchema(…)方法 import org.apache.spar

我是Spark的新手,这是我的第一个代码。如果我错了,请纠正我

我想加载多个文件,一个接一个-我不想引用一个文件夹一起处理。只想处理选定的文件

下面是我的代码(参考Spark docs),它可以处理单个文件,但当我处理多个文件时,它会为每个文件创建一个数据帧。我希望将数据添加到上一个数据框中,以便我添加的所有记录(来自多个文件)都位于单个表(mylogs)中。有什么方法可以做到这一点吗?我想分别为每个文件调用readFileToSchema(…)方法

import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestApp {

    public static void main(String[] args) {
        TestApp app = new TestApp();
        SparkSession spark = SparkSession.builder().appName("Simple Application")
                .config("spark.master", "local").getOrCreate();

        String[] afiles = {"/Users/logs/test1.txt","/Users/logs/test2.txt"};
        final List<String> files = Arrays.asList(afiles);

        for (String file : files) {
            app.readFileToSchema(spark, file);
        }
    }

    public void readFileToSchema(SparkSession spark, String filePath) {

        SparkContext sc = spark.sparkContext();
        JavaRDD<String> logRDD = sc.textFile(filePath, 1).toJavaRDD();

        String schemaString = "a1 b1 c1 d1";

        List<StructField> fields = new ArrayList<>();
        for (String fieldName : schemaString.split(" ")) {
            StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
            fields.add(field);
        }
        StructType schema = DataTypes.createStructType(fields);

        RegexMatch reg = new RegexMatch();
        JavaRDD<Row> rowRDD = logRDD
                .filter(line -> reg.isMatched(line))
                .map((Function<String, Row>) line -> {

                    String[] sp = line.split(" ");
                    String msg = line.substring(line.indexOf(sp[5]));
                    return RowFactory.create(sp[0] + " " + sp[1], sp[4], sp[5], msg);
                });

        Dataset<Row> logDataFrame = spark.createDataFrame(rowRDD, schema);

        logDataFrame.createOrReplaceTempView("mylogs");

        Dataset<Row> results = spark.sql("SELECT distinct(b1) FROM mylogs");

        List<Row> allrows = results.collectAsList();

        System.out.println("size : " + allrows.size());

        //spark.stop();
    }
}
import org.apache.spark.SparkContext;
导入org.apache.spark.api.java.JavaRDD;
导入org.apache.spark.api.java.function.function;
导入org.apache.spark.sql.Dataset;
导入org.apache.spark.sql.Row;
导入org.apache.spark.sql.RowFactory;
导入org.apache.spark.sql.SparkSession;
导入org.apache.spark.sql.types.DataTypes;
导入org.apache.spark.sql.types.StructField;
导入org.apache.spark.sql.types.StructType;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共类测试{
公共静态void main(字符串[]args){
TestApp app=新TestApp();
SparkSession spark=SparkSession.builder().appName(“简单应用程序”)
.config(“spark.master”、“local”).getOrCreate();
字符串[]afiles={/Users/logs/test1.txt“,“/Users/logs/test2.txt”};
最终列表文件=Arrays.asList(afiles);
用于(字符串文件:文件){
app.readFileToSchema(spark,文件);
}
}
public void readFileToSchema(SparkSession spark,字符串文件路径){
SparkContext sc=spark.SparkContext();
JavaRDD logRDD=sc.textFile(filePath,1).toJavaRDD();
字符串schemaString=“a1 b1 c1 d1”;
列表字段=新的ArrayList();
for(字符串字段名:schemaString.split(“”)){
StructField=DataTypes.createStructField(fieldName,DataTypes.StringType,true);
字段。添加(字段);
}
StructType schema=DataTypes.createStructType(字段);
RegexMatch reg=新的RegexMatch();
JavaRDD rowRDD=logRDD
.filter(行->注册表已匹配(行))
.map((功能)行->{
字符串[]sp=line.split(“”);
字符串msg=line.substring(line.indexOf(sp[5]);
返回RowFactory.create(sp[0]+“”+sp[1],sp[4],sp[5],msg);
});
Dataset logDataFrame=spark.createDataFrame(rowRDD,schema);
logDataFrame.createOrReplaceTempView(“mylogs”);
Dataset results=spark.sql(“从mylogs中选择distinct(b1));
List allrows=results.collectAsList();
System.out.println(“大小:+allrows.size());
//spark.stop();
}
}
试试这个

    public static void main(String[] args) {
        TestApp app = new TestApp();
        SparkSession spark = SparkSession.builder().appName("Simple Application")
            .config("spark.master", "local").getOrCreate();

        String afiles = "/Users/logs/test1.txt,/Users/logs/test2.txt";
        app.readFileToSchema(spark, afiles);
    }

    public void readFileToSchema(SparkSession spark, String files) {
        SparkContext sc = spark.sparkContext();
        JavaRDD<String> logRDD = sc.textFile(files).toJavaRDD();

   //Rest of your code.
   }
publicstaticvoidmain(字符串[]args){
TestApp app=新TestApp();
SparkSession spark=SparkSession.builder().appName(“简单应用程序”)
.config(“spark.master”、“local”).getOrCreate();
字符串afiles=“/Users/logs/test1.txt,/Users/logs/test2.txt”;
应用程序readFileToSchema(spark,afiles);
}
public void readFileToSchema(SparkSession spark,字符串文件){
SparkContext sc=spark.SparkContext();
JavaRDD logRDD=sc.textFile(files).toJavaRDD();
//代码的其余部分。
}

您正在寻找的方法将是
unionAll
unionAll已被弃用,并且只有在查询时才会使用更多的over union?感谢您的回复,实际上我知道这个解决方案,但我的问题不同,我不想一次发送所有文件,需要调用readFileToSchema(…)如我的示例(for循环)中所示,分别针对每个文件。