簡體   English   中英

Apache Spark SQL上下文dropDuplicates

[英]Apache Spark SQL context dropDuplicates

我正在嘗試使用Spark的1.5方法dropDuplicates()過濾DataFrame內容。 將其與完全填充數據的表一起使用(我的意思是沒有空單元格)會給出正確的結果,但是當我的CSV源包含空單元格時(我將為您提供源文件)-引發throw ArrayIndexOutOfBoundsException。 我究竟做錯了什么? 我已經閱讀了1.6.2版的Spark SQL和DataFrames教程,但沒有詳細介紹DataFrame操作。 我也在看《學習Spark。閃電快速的大數據分析》一書,但是它是為Spark 1.5寫的,這里沒有描述我需要的操作。 我很高興獲得解釋,或者鏈接到手冊。 謝謝。

    package data;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.StructType;

import java.util.Arrays;

public class TestDrop {
    public static void main(String[] args) {
        DropData dropData = new DropData("src/main/resources/distinct-test.csv");
        dropData.execute();
    }
}

class DropData{

    private String csvPath;
    private JavaSparkContext sparkContext;
    private SQLContext sqlContext;

    DropData(String csvPath) {
        this.csvPath = csvPath;
    }

    void execute(){
        initContext();
        DataFrame dataFrame = loadDataFrame();
        dataFrame.show();
        dataFrame.dropDuplicates(new String[]{"surname"}).show();
        //this one fails too: dataFrame.drop("surname")
    }

    private void initContext() {
        sparkContext = new JavaSparkContext(new SparkConf().setMaster("local[4]").setAppName("Drop test"));
        sqlContext = new SQLContext(sparkContext);
    }

    private DataFrame loadDataFrame() {
        JavaRDD<String> strings = sparkContext.textFile(csvPath);

        JavaRDD<Row> rows = strings.map(string -> {
            String[] cols = string.split(",");
            return RowFactory.create(cols);
        });

        StructType st = DataTypes.createStructType(Arrays.asList(DataTypes.createStructField("name", DataTypes.StringType, false),
                DataTypes.createStructField("surname", DataTypes.StringType, true),
                DataTypes.createStructField("age", DataTypes.StringType, true),
                DataTypes.createStructField("sex", DataTypes.StringType, true),
                DataTypes.createStructField("socialId", DataTypes.StringType, true)));

        return sqlContext.createDataFrame(rows, st);
    }
}

發送列表而不是Object []會導致創建行,其中包含1列,其中包含一個列表。 那就是我做錯了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM