使用spark 2.0中的分区加载csv数据

时间:2016-08-25 08:14:19

标签: java apache-spark

在Spark 2.0中,我有以下方法将数据加载到数据集

public Dataset<AccountingData> GetDataFrameFromTextFile()
{     // The schema is encoded in a string
    String schemaString = "id firstname lastname accountNo";

    // Generate the schema based on the string of schema
    List<StructField> fields = new ArrayList<>();
    for (String fieldName : schemaString.split("\t")) {
        StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);
        fields.add(field);
    }
    StructType schema = DataTypes.createStructType(fields);

    return  sparksession.read().schema(schema)
            .option("mode", "DROPMALFORMED")
            .option("sep", "|")
            .option("ignoreLeadingWhiteSpace", true)
            .option("ignoreTrailingWhiteSpace ", true)
            .csv("D:\\HadoopDirectory\Employee.txt").as(Encoders.bean(Employee.class));
}

并在我的驱动程序代码中,在数据集上调用Map操作

    Dataset<Employee> rowDataset = ad.GetDataFrameFromTextFile();

    Dataset<String> map = rowDataset.map(new MapFunction<Employee, String>() {
        @Override
        public String call(Employee emp) throws Exception {
            return  TraverseRuleByADRow(emp);
        }
    },Encoders.STRING());

当我在我的笔记本电脑上以8核运行驱动程序时,我看到8个分区分割输入文件。我知道是否有办法将文件加载到8个以上的分区,比如1​​00或者1000个分区?

我知道如果源数据是通过jdbc来自sql server表,那么这是可以实现的。

sparksession.read().format("jdbc").option("url", urlCandi).option("dbtable", tableName).option("partitionColumn", partitionColumn).option("lowerBound", String.valueOf(lowerBound))
                .option("upperBound", String.valueOf(upperBound))
                .option("numPartitions", String.valueOf(numberOfPartitions))
                .load().as(Encoders.bean(Employee.class));

由于

1 个答案:

答案 0 :(得分:0)

使用Dataset中的repartition()方法。根据{{​​3}},在阅读

时无法设置分数