尝试在Java中的Spark Dataset中添加列时获取空指针异常

时间:2018-10-08 18:53:32

标签: java loops apache-spark apache-spark-dataset

我正在尝试遍历Java中的数据集行,然后访问特定列以查找作为键存储在JSON文件中的值并获取其值。对于所有行,需要将找到的值存储为该行中的新列值。

我看到从JSON文件获得的cluster_val不是NULL,但是当我尝试将其添加为列时,我得到了Exception in thread "main" org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 1.0 failed 1 times, most recent failure: Lost task 0.0 in stage 1.0 (TID 1, localhost, executor driver): java.lang.NullPointerException

到目前为止,我有这个:

Dataset<Row> df = spark.read().format("csv").load(path);
        df.foreach((ForeachFunction<Row>) row ->
    {
        String df_col_val = (String) row.get(6);
        System.out.println(row.get(6));
        if(df_col_val.length() > 5){
            df_col_val = df_col_val.substring(0, df_col_val.length() - 5 + 1); //NOT NULL
        }
        System.out.println(df_col_val); 
        String cluster_val = (String) jo.get(df_col_val); //NOT NULL
        System.out.println(cluster_val);
        df.withColumn("cluster", df.col(cluster_val));  // NULL POINTER EXCEPTION. WHY?

        df.show();

    });

因此,大多数情况下,我需要逐行读取数据集并执行上述后续操作的帮助。 无法在线找到太多参考。如果可能的话,请转介我以更正来源。另外,如果有简便的方法,请告诉我。

所以我发现df.col(cluster_val)抛出了异常,因为没有现有的列。如何将列的字符串名称转换为传递withColumn()函数pf数据集所需的列类型

更新:

因此,我尝试了以下操作,在这里我尝试使用udf获取新列的值,但如果使用这种方式,则为null:

Dataset<Row> df = spark.read().format("csv").option("header", "true").load(path);

            Object obj = new JSONParser().parse(new FileReader("path to json"));
            JSONObject jo = (JSONObject) obj;

                df.withColumn("cluster", functions.lit((String) jo.get(df.col(df_col_val)))));
        df.show();

1 个答案:

答案 0 :(得分:1)

使用df.withColumn时,第一个参数作为列名,第二个参数作为该列的值。 如果您想添加名称为“ cluster”的新列,并从某个json值中添加值,则可以使用“ lit”函数作为lit(cluster_val),其中cluster_val保留值。

您必须导入“ org.apache.spark.sql.functions._”才能使用照明功能。

希望对您有帮助。