当前位置: 首页 > 知识库问答 >
问题:

获得空指针异常时,试图添加一列火花数据集在Java

裴兴言
2023-03-14

我试图在java中迭代数据集行,然后访问特定的列,找到它作为键存储在JSON文件中的值,并获取它的值。对于所有行,找到的值需要作为新列值存储在该行中。

我看到我从JSON文件中获得的cluster_val不是空的,但当我尝试将其添加为列时,我在线程“main”组织中得到了Exception。阿帕奇。火花SparkException:作业因阶段失败而中止:阶段1.0中的任务0失败1次,最近的失败:阶段1.0中的任务0.0丢失(TID 1,本地主机,执行器驱动程序):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()函数所需的列类型

更新:

所以我尝试了下面的新列,我尝试使用udf获取新列的值,但是如果这样使用,它是空的:

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个答案

柳绪
2023-03-14

在使用df时。withColumn需要第一个参数作为列名,第二个参数作为该列的值。如果您想添加名为“cluster”且值为某个json值的新列,那么可以使用“lit”函数作为lit(cluster_val),其中cluster_val保存值。

你必须导入“org.apache.spark.sql.functions._”才能使用点燃功能。

我希望它能有所帮助。

 类似资料:
  • zapier中的Javascript代码 在Action类中,我正在获取请求数据 正在获取异常 java.lang.NullPointerException\n\tat java.io.StringReader

  • 我有一个3节点星火集群。并尝试使用snowflake spark连接器和jdbc驱动程序访问snowflake jdbc:snowflake-jdbc-3.12.4.jar spark-connector:spark-snowflake_2.11-2.7.0-spark_2.4.jar 下面是我的代码: 我在sdf.show()上的调用失败,但有以下例外情况。有什么建议吗?

  • 问题内容: 你好 javac不喜欢我在第8行所做的事情。有人知道为什么吗? 问题答案: 现货在沃特福德。第7行所做的只是告诉Java在二维数组中为n * n个Hexagon对象创建空间。 您仍然需要为每个这些六边形调用新的 本质上,您需要将第7行替换为:

  • 08-0712:11:44.453:I/Choreographer(1257):跳过126帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:46.313:I/Choreographer(1257):跳过了131帧! 应用程序可能在主线程上做了太多工作。08-07 12:11:48.033:I/Choreographer(1257):跳过了33个帧! 应用程序可能在主线程上做了太多的

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于

  • 我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db