我正在尝试遍历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();
答案 0 :(得分:1)
使用df.withColumn时,第一个参数作为列名,第二个参数作为该列的值。 如果您想添加名称为“ cluster”的新列,并从某个json值中添加值,则可以使用“ lit”函数作为lit(cluster_val),其中cluster_val保留值。
您必须导入“ org.apache.spark.sql.functions._”才能使用照明功能。
希望对您有帮助。