我正在使用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上使用?
谢谢!
答案 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..>)