Apache spark 火花链转换导致异常

Apache spark 火花链转换导致异常,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我正在处理具有以下模式的数据 Array(Struct(field1, field2)) -> lets call it arr 执行以下操作-使用列链接: df = df.withColumn("arr_exploded", df.col("arr")).withColumn("field1", df.col("arr_exploded.field1")) 导致崩溃,并出现以下错误: Exception in thread "main" org.apache.spark.sql.A

我正在处理具有以下模式的数据

Array(Struct(field1, field2)) -> lets call it arr

执行以下操作-使用列链接

df = df.withColumn("arr_exploded", df.col("arr")).withColumn("field1", df.col("arr_exploded.field1"))
导致崩溃,并出现以下错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Cannot resolve column name "arr_exploded.field1" among (arr);
因此,这意味着第二个
with column
将首先执行。为什么会发生这种情况以及如何预防

注意,我发现以下解决方案有效,哪一个更好

/* Two Line approach */
df = df.withColumn("arr_exploded", df.col("arr"))
df = df.withColumn("field1", df.col("arr_exploded.field1"))


DataFrame
s本质上是不可变的,每个方法返回一个新实例。
withColumn
也执行相同的操作

使用
df.col(“arr\u exploded.field1”)
时,您的
df
引用仍然指向旧实例

第一种方法更好,您可以在一行中完成:

import spark.implicits._
df.withColumn("arr_exploded", $"arr").withColumn("field1", $"arr_exploded")
爪哇方式

import static org.apache.spark.sql.functions.col;
df.withColumn("arr_exploded", col("arr")).withColumn("field1", col("arr_exploded"))

谢谢你的回答:)遗憾的是,我正在使用Java,而它的含义是无法触及的。@krystalgamer我添加了Java示例非常感谢!一直在使用
org.apache.spark.sql.functions
很多,真是一个有用的包!
import static org.apache.spark.sql.functions.col;
df.withColumn("arr_exploded", col("arr")).withColumn("field1", col("arr_exploded"))