Apache spark 尝试在groupBy之后映射值时,不能将null用作映射键

Apache spark 尝试在groupBy之后映射值时,不能将null用作映射键,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我在这里试图实现的是按数据帧中的所有元素分组,然后将它们的所有多个值聚合到一个列中,该列将包含一个值列表(map()) val sampleDF = baseDF .groupBy( Yyyy, MmDd, SampleField) .agg( functions.collect_list( functions.map( Selectors.selectColumn(Name), Selectors.select

我在这里试图实现的是按数据帧中的所有元素分组,然后将它们的所有多个值聚合到一个列中,该列将包含一个
值列表(map())

val sampleDF = baseDF
  .groupBy(
    Yyyy,
    MmDd,
    SampleField)
  .agg(
    functions.collect_list(
      functions.map(
        Selectors.selectColumn(Name),
        Selectors.selectColumn(Surname)
      )
    )
  )
但是,当尝试执行该代码时,会显示以下错误

java.lang.RuntimeException:不能将null用作映射键!

为什么一个值是否为null很重要?它怎么会假装用它当钥匙呢

我想得到的一个简单例子是

20190101,“样本场”,列表(地图(名称->样本,姓氏->样本),地图(名称->样本2,姓氏->样本2))


我的理解是,它将列名作为键(永远不会为空),然后不管发生什么情况都应用该值。

根据
map
的文档:

创建一个新的映射列。输入列必须分组为 键值对,例如(键1、值1、键2、值2等)。钥匙 所有列必须具有相同的数据类型,并且不能为null。价值 所有列必须具有相同的数据类型

因此,请将代码更改为:

val sampleDF = baseDF
.groupBy(
   Yyyy,
   MmDd,
   SampleField)
.agg(
    functions.collect_list(
      functions.map(
        lit("Name"),
        $"Name",
        lit("Surname"),
        $"Surname"
      )
    )
  )

根据
地图的文档

创建一个新的映射列。输入列必须分组为 键值对,例如(键1、值1、键2、值2等)。钥匙 所有列必须具有相同的数据类型,并且不能为null。价值 所有列必须具有相同的数据类型

因此,请将代码更改为:

val sampleDF = baseDF
.groupBy(
   Yyyy,
   MmDd,
   SampleField)
.agg(
    functions.collect_list(
      functions.map(
        lit("Name"),
        $"Name",
        lit("Surname"),
        $"Surname"
      )
    )
  )