如何在 Spark 中获取 WrappedArray 的第一个值?

How to get first value of WrappedArray in Spark?

我按几列分组并从这些列中得到 WrappedArray 正如您在架构中看到的那样。如何摆脱它们,以便我可以继续下一步并执行 orderBy?

val sqlDF = spark.sql("SELECT * FROM 
  parquet.`parquet/20171009121227/rels/*.parquet`")

获取数据帧:

val final_df = groupedBy_DF.select(
  groupedBy_DF("collect_list(relev)").as("rel"),
  groupedBy_DF("collect_list(relev2)").as("rel2"))

然后打印模式给我们:final_df.printSchema

|-- rel: array (nullable = true)
|    |-- element: double (containsNull = true)
|-- rel2: array (nullable = true)
|    |-- element: double (containsNull = true)

当前输出示例:

我正在尝试转换为:

 |-- rel: double (nullable = true)
 |-- rel2: double (nullable = true)

期望的示例输出(来自上图):

-1.0,0.0
-1.0,0.0

尝试 col(x).getItem:

groupedBy_DF.select(
    groupedBy_DF("collect_list(relev)").as("rel"),
    groupedBy_DF("collect_list(relev2)").as("rel2")
).withColumn("rel_0", col("rel").getItem(0))

如果 collect_list 总是只有 return 一个值,请改用 first。那么就不需要处理有Array的问题了。请注意,这应该在 groupBy 步骤中完成。

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._

val final_df = df.groupBy(...)
  .agg(first($"relev").as("rel"), 
       first($"relev2").as("rel2"))

尝试拆分

import org.apache.spark.sql.functions._

val final_df = groupedBy_DF.select(
  groupedBy_DF("collect_list(relev)").as("rel"),
  groupedBy_DF("collect_list(relev2)").as("rel2"))
  .withColumn("rel",split("rel",","))