如何修复“不能将空值用作映射键!”使用Group_Map的Python 3在Spark.SQL中出现错误

时间:2019-02-12 14:32:21

标签: python python-3.x apache-spark hadoop

我正在使用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:不能将null用作映射键!

有帮助吗?为什么它可以在Python2上使用?

谢谢!

2 个答案:

答案 0 :(得分:0)

您正在尝试定义一个缺少的值,在这种情况下为VALUE1,COL1。空值不是返回Null值的正确方法,您需要将其定义为None。因此,您要做的是将VALUE1和COL1定义为None

答案 1 :(得分:0)

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

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