【问题标题】:Cannot use null as map key when trying to map values after groupBy尝试在 groupBy 之后映射值时不能使用 null 作为映射键
【发布时间】:2019-09-03 19:18:28
【问题描述】:

我在这里尝试实现的是对 Dataframe 中的所有元素进行分组,然后将它们的所有多个值聚合到一个包含 list(map()) 值的列中。

val sampleDF = baseDF
  .groupBy(
    Yyyy,
    MmDd,
    SampleField)
  .agg(
    functions.collect_list(
      functions.map(
        Selectors.selectColumn(Name),
        Selectors.selectColumn(Surname)
      )
    )
  )

但是,当尝试执行该代码时,会显示以下错误。

java.lang.RuntimeException: Cannot use null as map key!

为什么值是否为 null 很重要?它是如何伪装成钥匙的?

我想获得的一个简短示例是...

2019, 0101, "sampleField", List(Map(name -> Sample, surname -> Sample), Map(name -> Sample2, surname -> Sample2))

我的理解是,它将列名作为键(永远不会为空),然后无论如何都应用该值。

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    根据map的文档:

    创建一个新的地图列。输入列必须分组为 键值对,例如(键 1,值 1,键 2,值 2,...)。钥匙 列必须都具有相同的数据类型,并且不能为空。价值 列必须都具有相同的数据类型。

    因此,将您的代码更改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 2017-05-23
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多