如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误

Posted

技术标签:

【中文标题】如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误【英文标题】:How to fix "Cannot use null as map key!" error in Spark.SQL with Python 3 using Group_Map 【发布时间】:2019-02-12 14:32:21 【问题描述】:

我正在使用 Spark.SQL,我正在尝试使用 MAP 语句创建一个数据透视表,以便将一列的值作为不同的列。

我用这个查询准备了第一个表:

spark.sql("""CREATE TABLE TABLE_01 STORED AS PARQUET AS
select
ROWS,
COLUMNS,
count(*) as NUM_ROWS
from TABLE_00
group by ROWS, COLUMNS
order by ROWS, COLUMNS
""")

这个想法是这样转换的:

ROWS    COLUMNS NUM_ROWS
VALUE1   COL2    2
VALUE1   COL3    50
VALUE2   COL1    20
VALUE2   COL2    1
VALUE2   COL3    30

进入这个:

                COLUMNS

              COL1          |  COL2     |  COL3
ROWS
      ------------------------------------------------------
VALUE1  0 (The problem)     |    2      |   50

VALUE2       20             |    1      |   30 

我在 Python2 中有一个查询,它曾经可以工作,但现在我必须更改为 Python3,我快疯了。查询是:

spark.sql("""CREATE TABLE TABLE_02 STORED AS PARQUET AS
select
a.ROWS,
coalesce(sum(a.group_map['COL1']),0) as COL1,
coalesce(sum(a.group_map['COL2']),0) as COL2,
coalesce(sum(a.group_map['COL3']),0) as COL3
from 
    (
    select ROWS, map(COLUMNS,NUM_ROWS) as group_map
    from TABLE_01
    ) a
group by a.ROWS
""")

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

有什么帮助吗?为什么它适用于 Python2?

谢谢!

【问题讨论】:

看看***.com/a/39121638/4777984 【参考方案1】:

您正在尝试定义一个缺失值,在本例中为 VALUE1、COL1。空值不是返回Null 值的正确方法,您需要将其定义为None。所以你要做的就是将VALUE1,COL1定义为None

【讨论】:

你能告诉我更多细节吗? 现在我看到了你的错误。忘记dict,我会编辑我的答案。在 SQL 中,您需要定义一个“无”值,而不仅仅是放置一个缺失的对象,在您的情况下:VALUE 1,COL1。您需要将其定义为无。 怎么样?我需要将 None 值作为所有值的默认值,因为它必须准备好在任何地方找到 null。你知道怎么做吗?谢谢! 如果他们找到它,他们将返回空值,但你需要为 VALUE 1,COL1 定义一些东西,因为它理解为一个空值。 如您所见,原始表不包含 COLS 和 ROWS 之间的所有可能组合。我无法将缺少的组合转换为某些东西。我根本没有值为 COL1、VALUE1 的行。如何映射该值?【参考方案2】:

理想情况下,您正在查看数据透视,而不是为此手动编写代码,您可以尝试下面的代码块

df
  .groupBy($"<column name>", .. <columns to be grouped, here VALUE1, VALUE2,...>)
  .pivot("<column name>",...<columns to pivot, here COL1, COL2, ...>)
  .agg(<aggreagation expressions..>)

【讨论】:

以上是关于如何解决“不能使用 null 作为映射键!”使用 Group_Map 在 Python 3 中出现 Spark.SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用流解决以下练习

如何使用STP解决交换机环路问题

如何解决mysql5

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用网络爬虫提前解决 reCaptcha? [关闭]

java面试问独立解决过哪些难题